首页 > 其他分享 >前后端密码加密

前后端密码加密

时间:2022-12-09 11:34:19浏览次数:42  
标签:加密 String 前后 iv 密码 key keyStr new CryptoJS

1 前端

安装crypto

npm install crypto-js

js工具

import CryptoJS from 'crypto-js/crypto-js'

/**
 * AES加密 :字符串 key iv  返回base64
 */
export function Encrypt(word, keyStr) {
  let key,iv,ivStr;
  if (!keyStr) {
    throw new Error("keyStr 不能为空");
  }
  ivStr = keyStr;
  key = CryptoJS.enc.Utf8.parse(keyStr);
  iv = CryptoJS.enc.Utf8.parse(ivStr);
  let srcs = CryptoJS.enc.Utf8.parse(word);
  var encrypted = CryptoJS.AES.encrypt(srcs, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding
  });
  // console.log("-=-=-=-", encrypted.ciphertext)
  return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);

}
/**
 * AES 解密 :字符串 key iv  返回base64
 */
export function Decrypt(word, keyStr) {

  let key,iv,ivStr;
  if (!keyStr) {
    throw new Error("keyStr 不能为空");
  }
  ivStr = keyStr;
  key = CryptoJS.enc.Utf8.parse(keyStr);
  iv = CryptoJS.enc.Utf8.parse(ivStr);

  let base64 = CryptoJS.enc.Base64.parse(word);
  let src = CryptoJS.enc.Base64.stringify(base64);

  var decrypt = CryptoJS.AES.decrypt(src, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding
  });

  var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  return decryptedStr.toString();
}

2 后端

public class AesUtil {
    /**
     * 加密方法
     * @param data  要加密的数据
     * @param key 加密key
     * @return 加密的结果
     * @throws Exception
     */
    public static String encrypt(String data, String key){
        try {
            String iv = key;
            //"算法/模式/补码方式"NoPadding PkcsPadding
            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            int blockSize = cipher.getBlockSize();

            byte[] dataBytes = data.getBytes();
            int plaintextLength = dataBytes.length;
            if (plaintextLength % blockSize != 0) {
                plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
            }

            byte[] plaintext = new byte[plaintextLength];
            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
            byte[] encrypted = cipher.doFinal(plaintext);

            return new Base64().encodeToString(encrypted);

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 解密方法
     * @param data 要解密的数据
     * @param key  解密key
     * @return 解密的结果
     * @throws Exception
     */
    public static String desEncrypt(String data, String key) {
        try {
            String iv = key;
            byte[] encrypted1 = new Base64().decode(data);
            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original, "utf-8");
            return originalString;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 生成默认的 key 和 iv,key = iv iv 的长度必须是16位
     **/
    public static String generateKeyAndIv(){
        String uid = SecureUtil.md5(String.valueOf(System.currentTimeMillis()));
        // 盐加密
        String salt = UUID.randomUUID().toString();
        uid = SecureUtil.md5(uid + salt);
        return uid.substring(16);
    }
}

3 使用

前端发送请求时使用工具加密字段

import {Encrypt} from "@/utils/aesUtil";
//密码16位,前后端保持一致
let key = "aaaaaaaaaaaaaaaa"
let psw = Encrypt(password.trim(),key)

后端解析

String psw = AesUtil.desEncrypt(password, "aaaaaaaaaaaaaaaa");

标签:加密,String,前后,iv,密码,key,keyStr,new,CryptoJS
From: https://www.cnblogs.com/eaglex3/p/16968456.html

相关文章

  • 【Linux】win10子系统 WSL, 忘记 root用户密码的修复方式
    1.先修改root用户的密码:以管理员身份打开PowerShell输入命令wsl.exe--userroot修改root用户密码:passwdroot2.再修改其他用户的密码进入ubuntu,登录......
  • Chapter10_试着加密数据吧
    热身问答通常把还原加密过的文件这一操作叫作什么?解码解密在字母A的字符编码上加上3,可以得到哪个字母?D因为字母表中的字母编码是按字母顺序排列的,所以在字母......
  • Uni App-----之u-input(密码明文小眼睛切换)
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • 对称加密
    对称加密概述:对称加密就是加密和解密使用同一个密钥;就好比.我要给你邮寄一个箱子.上面怼上锁.提前我把钥匙给了你一把,我一把.那么我在邮寄之前就可以把箱子锁上.然......
  • 解一个webpack打包后加密的JS代码
    源码过长,只贴部分加密的源代码如下0x1fc9:function(_0x2715a2,_0x5a118b,_0x344094){const_0x23ae3e=_0x344094(`611c`);class_0x2e9b72{......
  • 加密库选择
    加密库使员工选择:nginxopensslpolarssllyassl(wolfssl)matrixssl上周折腾加密与解密,用了openssl,crypto++,polarssl,cyassl,说起真的......
  • 用NetCore + ReactJS 实现一个前后端分离的网站 (6) 缓存机制
    1.前言对于实时性要求不高的资源,我们一般可以利用缓存机制来降低数据库的请求压力。轻量级的应用可以用自带的MemoryCache,如果对缓存的高并发、持久化有要求的可以用Red......
  • 给PDF加密码真的是安全的吗,这里告诉你真相!
    PDF加密的原理所谓的PDF加密,就是给您的PDF文件加一个密码保护,其他人打开的时候,需要输入密码,那它具体是什么做的呢,我们来看看吧!PDF加密的算法简介RC4是对称流密码(即,可以......
  • oidc登录不输入用户名密码的配置方法
    web项目中需要通过windows登录的域账号信息获取token来进行登录的操作,使用的是oidc的signin方法但是每次清除token缓存后,页面会弹出输入用户名和密码的弹窗好像是oidc无......
  • Vue设计table中的身份证号加密显示
    为了保护用户隐私,需要对身份证号中间进行加密,且需要考虑末尾带有X的情况话不多少直接上代码,运用正则解决:<el-table-columnprop="idcard"label="身份证"width="180">......