前端 crypto-js AES 加密和解密

发布时间:2019-12-08 编辑:小张个人博客 查看次数:1130

crypto-js AES 加密和解密

crypto-js 是一个纯 javascript 写的加密算法类库 ,可以非常方便地在 javascript 进行 MD5、SHA1、SHA2、SHA3、RIPEMD-160 哈希散列,进行 AES、DES、Rabbit、RC4、Triple DES 加解密,我们可以采用 npm install crypto-js --save 进行下载安装,也可以直接去 GitHub下载源码:

https://github.com/brix/crypto-js


    对系统安全性要求比较高,那么需要选择 https 协议来传输数据。当然很多情况下一般的 web 网站,如果安全要求不是很高的话,用 http 协议就可以了。在这种情况下,密码的明文传输显然是不合适的,因为如果请求在传输过程中被截了,就可以直接拿明文密码登录网站了。


     对于使用 http 协议的 web 前端的加密,只能防君子不能防小人。前端是完全暴露的,包括你的加密算法。 知道了加密算法,密码都是可以破解的,只是时间问题。所以加密是为了增加破解的时间成本,如果破解需要花费的时间让人难以接受,这也就达到了目的。


      而为了保证数据库中存储的密码更安全,则需要在后端用多种单向(非对称)加密手段混合进行加密存储。前端加密后端又需要解密,所以需要对称加密算法,即前端使用 encrypted = encrypt(password+key),后端使用 password = decrypt(encrypted +key) ,前端只传输密码与 key 加密后的字符串 encrypted ,这样即使请求被拦截了,也知道了加密算法,但是由于缺少key所以很难破解出明文密码。所以这个 key 很关键。而这个 key 是由后端控制生成与销毁的,用完即失效,所以即使可以模拟用加密后的密码来发请求模拟登录,但是 key 已经失效了,后端还是验证不过的。

   

     注意,如果本地环境本就是不安全的,key 被知道了,那就瞬间就可以用解密算法破解出密码了。这里只是假设传输的过程中被截获的情形。所以前端加密是防不了小人的。如果真要防,可以将加密算法的 js 文件进行压缩加密,不断更新的手段来使js文件难以获取,让黑客难以获取加密算法。变态的 google 就是这么干的,自己实现一个 js 虚拟机,通过不断更新加密混淆js文件让加密算法难以获取。这样黑客不知道加密算法就无法破解了。

<body>
    <script src="./crypto-js.js"></script>
    <script>
    function getAesString(data, key, iv) { //加密
        var key = CryptoJS.enc.Utf8.parse(key);
        var iv = CryptoJS.enc.Utf8.parse(iv);
        var encrypted = CryptoJS.AES.encrypt(data, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        return encrypted.toString(); //返回的是base64格式的密文
    }

    function getDAesString(encrypted, key, iv) { //解密
        var key = CryptoJS.enc.Utf8.parse(key);
        var iv = CryptoJS.enc.Utf8.parse(iv);
        var decrypted = CryptoJS.AES.decrypt(encrypted, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        return decrypted.toString(CryptoJS.enc.Utf8);
    }

    function getAES(data) { //加密
        var key = '12345678910Asdfx'; //密钥
        var iv = '12345678910Asdfx';
        var encrypted = getAesString(data, key, iv); //密文
        var encrypted1 = CryptoJS.enc.Utf8.parse(encrypted);
        return encrypted;
    }

    function getDAes(data) { //解密
        var key = '12345678910Asdfx'; //密钥
        var iv = '12345678910Asdfx'; //密钥偏移量
        var decryptedStr = getDAesString(data, key, iv);
        return decryptedStr;
    }

    var AES = getAES('hello');
    var AFTERAES = getDAes(AES);
    console.log('加密后:' + AES );
    console.log('解密后:' + AFTERAES );

    </script>
</body>

</html>

上面的代码中的 key 是密钥 ,iv 是密钥偏移量,这个一般是接口返回的,为了方便,我们这里就直接在这里定义了。

值得注意的是密钥的长度,由于对称解密使用的算法是  AES-128-CBC 算法,数据采用 PKCS#7 填充 , 因此这里的 key 需要为 16 位!


原文链接:https://www.cnblogs.com/it-xiong/p/10300016.html



出处:小张个人博客

网址:http://blog.023xs.cn/

您的支持是对博主最大的鼓励,感谢您的认真阅读。欢迎转载,但请保留该声明。

顶部

Copyright © 小张个人博客 All Rights Reserved 渝ICP备15006773号-1

联系方式:[email protected] | 本站文章仅供学习和参考

渝公网安备 50024102500267号