AES (高级加密标准) 是美国联邦信息处理标准 (FIPS)。它是经过 5 年的过程,对 15 种竞争设计进行评估后选出的。CryptoJS 支持 AES-128、AES-192 和 AES-256。它将根据您传入的密钥的大小来选择变体。
1、安装
npm install crypto-js
2、封装
//引用AES源码js
import CryptoJS from 'crypto-js'
const key = CryptoJS.enc.Utf8.parse("1234123412ABCDEF");//十六位十六进制数作为密钥
const iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412');//十六位十六进制数作为密钥偏移量
//解密方法
function Decrypt(word) {
//返回的是解密后的对象
let decrypt = CryptoJS.AES.decrypt(restoreBase64,key,{
iv:iv,
mode:CryptoJS.mode.CBC,
padding:CryptoJS.pad.Pkcs7
});
//将解密对象转换成UTF8的字符串
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
//返回解密结果
return decryptedStr.toString();
}
//加密方法
function Encrypt(word){
let srcs = CryptoJS.enc.Utf8.parse(word);
//返回的是一个加密对象
let encrypted = CryptoJS.AES.encrypt(srcs,key,{
iv:iv,
mode:CryptoJS.mode.CBC,
padding:CryptoJS.pad.Pkcs7
});
//将结果进行base64加密
return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
}
export {Decrypt,Encrypt}
CipherOption,加密的一些选项:
- mode:加密模式,可取值(CBC,CFB,CTR,CTRGladman,OFB,ECB),都在CryptoJS.mode对象下
- padding:填充方式,可取值(Pkcs7,Ansix923,Iso10126,ZeroPadding,NoPadding),都在CryptoJS.pad对象下
- iv:偏移量,mode===ECB时,不需要iv
3、使用
import {Encrypt} from "../../utils/secret";
var userName = Encrypt(this.userName)//加密用户名
var userPassword = Encrypt(this.password)//加密用户密码
console.log('加密后:',userName)
console.log('加密后:',userPassword)
4、加入rsa传递aes秘钥的情况处理(不推荐)
// rsaHelper.js
import JsEncrypt from 'jsencrypt/bin/jsencrypt'
import { getKey, AESEnc, AESDec } from './lib/aes'
export const rsaEncode = (string = '') => {
// const RSA = new
const publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCRQZ5O/AOAjeYAaSFf6Rjhqovws78I716I9oGF7WxCIPmcaUa1YuyLOncCCuPsaw69+RMWjdbOBp8hd4PPM/d4mKTOVEYUE0SfxhhDTZaM5CzQEUXUyXy7icQTGR5wBjrbjU1yHCKOf5PJJZZQWB06husSFZ40TdL7FdlBpZ1u1QIDAQAB";
const encrypt = new JsEncrypt.JSEncrypt();
encrypt.setPublicKey(publicKey);
return encrypt.encrypt(string);
}
export const createKey = () => (getKey());
export const AES_ENCODE = (key, string = '') => {
if (!string) throw new Error('encry content is required');
return AESEnc(key, string);
}
export const AES_DECODE = (key, string = '') => {
if (!string) throw new Error('encry content is required');
return AESDec(key, string);
}
// 使用
// import { rsaEncode, AES_ENCODE, createKey } from '@/utils/rsaHelper';
// rsaEncode, AES_ENCODE, createKey
// const key = createKey();
// const data = {
// username: this.addData.userName,
// password: AES_ENCODE(key, this.addData.passWord),
// rsaEncryptKey: rsaEncode(key),
// }