CryptoJS:如何生成AES密码短语

8

我想要生成一个256位的密码来进行AES加密。当我在加密后检查这个密码时,它与我的初始密码不同。我做错了什么?还是有一些我不知道的安全机制?

我的代码:

password=Generate_key();

var encrypted = CryptoJS.AES.encrypt("Message", password);

//Those two should be the same
document.write(password+"<br>");
document.write(encrypted.key);


function Generate_key() {
    var key = "";
    var hex = "0123456789abcdef";

    for (i = 0; i < 64; i++) {
        key += hex.charAt(Math.floor(Math.random() * 16));
        //Initially this was charAt(chance.integer({min: 0, max: 15}));
    }
    return key;
}

输出结果如下:

0b05308c9a00f07044416bad7a51bacd282fc5c0c999551a4ff15c302b268b20 4df875993770411044fb35953166ee7833c32ca0741e9fec091dfa10138039e8

这个结果是正常的,你没有做错什么。感谢您的提问!


Math.floor(Math.random() * 16) 不等同于 chance.integer({min: 0, max: 15})。你应该尝试使用 Math.round(Math.random() * 15) - Biduleohm
2个回答

17

加密是使用一组二进制位而不是密码(即人类可读的字符串)来完成的。

要从密码转换为密钥,可以使用基于密码的密钥派生函数,例如PBKDF2。 Crypto-JS已经内置了PBKDF2函数

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js"></script>
<script>
    var salt = CryptoJS.lib.WordArray.random(128/8);

    var key128Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 128/32 });
    var key256Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32 });
    var key512Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 512/32 });

    var key512Bits1000Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 512/32, iterations: 1000 });
</script>

总的来说,尽可能使用高迭代次数。

盐应该是一个随机值,就像上面的示例一样;当然,您需要将该值与迭代次数一起存储,以便在给定相同的口令时获得相同的密钥。


3
如果我根本不需要密码短语,只想生成密钥并将其保存在某个地方,那怎么办?或者解决方案是使用我的 generate_key() 生成一个密码短语,将其解析为密钥,然后使用 AES 加密? - Ron
1
然后,您将使用与生成盐和初始化向量(IV)相同的技术来生成密钥,即使用密码学随机库。在此示例中,您可以同时使用CryptoJS.lib.WordArray.random来生成密钥和IV。 - Anti-weakpasswords
哇,CryptoJS开发人员指定PBKDF2密钥大小为32位字,真是个混蛋! - zaph
链接已经失效! - Aimal Khan

2
我找到了解决方案。您可以使用以下代码自定义密钥: var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv }); 因此,我的源代码如下:
key=CryptoJS.enc.Hex.parse(Generate_key());
iv=CryptoJS.enc.Hex.parse(Generate_key());
var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });

7
你是如何生成密钥的? - Arj 1411
在问题中 - Ron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接