V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
gdtv
V2EX  ›  问与答

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

  •  
  •   gdtv · 2017-03-27 21:52:52 +08:00 · 6829 次点击
    这是一个创建于 2651 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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>
    

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   921 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:14 · PVG 06:14 · LAX 15:14 · JFK 18:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.