请教使用 CryptoJS 在前端加密和解密的问题,请帮忙看下我写的代码有没有毛病

2017-03-27 21:52:52 +08:00
 gdtv

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>

6829 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/350741

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX