神坑CryptoJS AES加密
前端
引及CryptoJS文件
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
前台js使用CryptoJS AES加密
//AES加密
encryptByAES(string) {
const ckey = CryptoJS.enc.Utf8.parse("1234567890123456")
const iv = CryptoJS.enc.Utf8.parse('1234567812345678');
var encrypted = CryptoJS.AES.encrypt(str, ckey, {
iv: iv,
padding: CryptoJS.pad.Pkcs7,
mode: CryptoJS.mode.CBC
});
return encrypted.toString(); 此方式返回base64格式密文
//return encrypted.ciphertext.toString(); // 返回hex格式的密文
}
在需要加密的地方调用方法
aesEncrypt("需要加密的文本")
后端php
后端php代码
$iv = '1234567812345678';
$method = 'AES-128-CBC';
$key = '1234567890123456';
$options = 0;
#解密
$data2 = openssl_decrypt("需要解密的文本", $method, $key, $options, $iv);
#加密
openssl_encrypt('wang2016.', 'AES-128-CBC', $key,0, $iv);
重点来了!!!
CryptoJS.enc.Utf8.parse("1234567890123456"),前端需要转成utf8编码,不然会自动加盐,每次生成的密文都会不一样,导致后端解密失败。
密钥KEY:AES标准规定区块长度只有一个值,固定为128Bit,对应的字节为16位。AES算法规定密钥长度只有三个值,128Bit、192Bit、256Bit,对应的字节为16位、24位和32位,其中密钥KEY不能公开传输,用于加密解密数据。
CryptoJS.enc.Utf8.parse("1234567890123456"),注意秘钥的位数,最多是跟密码要求长度一样,如16位、24位和32位,不然会自动补齐,一样会导致后端解密失败。
CryptoJS.enc.Utf8.parse('1234567812345678'),前端需要转成utf8编码,否则会跟后端会解密失败;
初始化向量IV:该字段可以公开,用于将加密随机化。同样的明文被多次加密也会产生不同的密文,避免了较慢的重新产生密钥的过程,初始化向量与密钥相比有不同的安全性需求,因此IV通常无须保密。然而在大多数情况中,不应当在使用同一密钥的情况下两次使用同一个IV,一般推荐初始化向量IV为16位的随机值。
密钥和初始化向量:确保JavaScript和PHP中使用的是相同的密钥和初始化向量。密钥长度应为16、24或32字节(对应AES-128、AES-192、AES-256)。初始化向量(IV)长度也必须是16字节。