1

快速入门指南告诉我们可以这样使用aes.js

var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase"); 
var decrypt = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");

但它足够安全吗?加密是一个包含大量信息(密钥、iv、盐、密文)的数组。但是使用 PBKDF2 导出密码不是更安全吗?像这样 :

var salt = CryptoJS.lib.WordArray.random(128/8); 
var key512Bits1000Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 512/32, iterations: 1000 });
var iv  = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); 

encrypted = CryptoJS.AES.encrypt("Message", key512Bits1000Iterations, { iv: iv });  
var decrypt = CryptoJS.AES.decrypt(encrypted, key512Bits1000Iterations, { iv: iv });

谢谢 !

4

1 回答 1

1

如果您查看您指向的aes.js页面底部,您会发现:

与 OpenSSL 的互操作性

使用 OpenSSL 加密:

openssl enc -aes-256-cbc -in infile -out outfile -pass pass:"Secret Passphrase" -e -base64

使用 CryptoJS 解密:

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script>
    var decrypted = CryptoJS.AES.decrypt(openSSLEncrypted, "Secret Passphrase");
</script>

因此aes.js,如果您使用密码短语,将使用与 OpenSSL 兼容的密钥派生。


现在,如果您查看 OpenSSL 执行的密钥派生机制EVP_BytesToKey,您会发现以下注释:

较新的应用程序应使用更标准的算法,例如 PKCS#5v2.1 中定义的 PBKDF2 用于密钥派生。

于 2013-07-26T01:57:36.687 回答