【问题标题】:cryptojs: How to generate AES passphrasecryptojs:如何生成 AES 密码
【发布时间】:2014-04-05 01:11:11
【问题描述】:

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

我的代码:

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)

标签: encryption passwords aes cryptojs


【解决方案1】:

加密是通过密钥完成的,密钥是一组二进制位,而不是密码,密码是人类可读的字符串。

要从密码到密钥,可以使用基于密码的密钥派生函数,例如 PBKDF2。 Crypto-JS 已经有一个PBKDF2 function built-in,即

<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>

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

Salt 应该是一个随机值,如上例所示;当然,您需要将该值与迭代计数一起存储,以便在给定相同密码的情况下获得相同的密钥。

【讨论】:

  • 如果我根本不需要密码怎么办?我只想生成密钥并将其保存在某处。还是使用我的 generate_key() 生成密码短语的解决方案,将其解析为密钥然后使用 aes 加密?
  • 然后您将使用与生成盐和 IV 相同的技术生成密钥,即加密随机库。在此示例中,您将 CryptoJS.lib.WordArray.random 用于密钥和 IV。
  • 哇,CryptoJS 的开发者竟然在 32 位字中指定 PBKDF2 密钥大小!
  • 链接已损坏!
【解决方案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 });

【讨论】:

  • 你是如何生成密钥的?
  • 在问题中
猜你喜欢
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
相关资源
最近更新 更多