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>
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.