CryptoJS: https://code.google.com/archive/p/crypto-js/
目的是将用户输入的内容在前端加密后保存到服务器,要显示的时候从服务器取出来再在前端解密。密码不提交到服务器。
我对 js 不太懂,请问下面的加密和解密代码有没有什么漏洞?谢谢。
<script src="PATH_TO_CryptoJS/aes.js"></script>
<script src="PATH_TO_CryptoJS/md5.js"></script>
<script src="PATH_TO_CryptoJS/pad-zeropadding.js"></script>
<script>
var key = 'aaaaaaa'; //密码,由用户在客户端输入
//加密函数
function encrypt(message,key){
try{
//因为用户输入的密码不一定是 32 位,这里通过 md5 强行变为 32 位
key = CryptoJS.MD5(key);
//生成 16 位的随机向量
var iv = CryptoJS.lib.WordArray.random(8).toString();
//生成随机盐
var salt = CryptoJS.lib.WordArray.random(8).toString();
//给要加密的信息加上盐
message = salt+'|'+message;
//为了能加密中文,将要加密的信息用 base64 编码
var str64= CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(message));
var encrypted = CryptoJS.AES.encrypt(str64, CryptoJS.enc.Utf8.parse(key), { iv: CryptoJS.enc.Utf8.parse(iv),mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});
//将向量附加到密文里返回
var result = iv+'|'+encrypted.toString();
return result;
}catch(err) {
console.log(err);
}
}
//解密函数
function decrypt(message,key){
try{
//取出密文里的向量
var iv = message.substring(0,message.indexOf('|'));
//取出密文
var str = message.substring(message.indexOf('|')+1,message.length);
//解密
var decrypted = CryptoJS.AES.decrypt(str, CryptoJS.enc.Utf8.parse(CryptoJS.MD5(key)), { iv: CryptoJS.enc.Utf8.parse(iv),mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});
//因为前面用 base64 编码了,所以这里要解码
$result = CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(CryptoJS.enc.Utf8.stringify(decrypted)));
//去除盐
return $result.substring($result.indexOf('|')+1,$result.length);
}catch(err) {
console.log(err);
}
}
</script>