javascript - Nodejs crypto.pbkdf2 结果不同于 CryptoJS.PBKDF2

标签 javascript node.js cryptography cryptojs pbkdf2

我在前端 (CryptoJS) 和后端 (Node.js) 使用 PBKDF2, 派生 key 必须相等,所以我使用相同的盐、相同的算法、相同的迭代次数、相同的密码,但派生 key 不同。

这是浏览器/cryptoJS 代码,注释示例盐和 key 。 (十六进制)

<script type="text/javascript" src="pbkdf2.js"></script>
<script type="text/javascript" src="sha512.js"></script>
<script>
var salt = CryptoJS.lib.WordArray.random(128 / 8);
var key512Bits = CryptoJS.PBKDF2('anacleto', salt, { hasher:CryptoJS.algo.SHA512, keySize: 512 / 32, iterations: 1 });
console.log(salt.toString(CryptoJS.enc.Hex));
// 1427f23fd32f8f9902768e7ab7c7ffad
console.log(key512Bits.toString(CryptoJS.enc.Hex));
// de3259de39fcc55531b91b4ffb2a6c29005c674cc95b3ec5bdf18412b6087d05921f3a0e4148fc34c88a04e980481d397a4c2b143edc0cb1bb5d7434ca3b4c25
</script>

这是nodeJS代码

var crypto = require('crypto');
var salt_hex = '1427f23fd32f8f9902768e7ab7c7ffad';
var key_hex = 'de3259de39fcc55531b91b4ffb2a6c29005c674cc95b3ec5bdf18412b6087d05921f3a0e4148fc34c88a04e980481d397a4c2b143edc0cb1bb5d7434ca3b4c25';
var salt = new Buffer(salt_hex, 'hex');
crypto.pbkdf2('anacleto', salt.toString('utf8'), 1, 512/8, 'sha512', function (err, key) {
  if (err)
    throw err;
  var x = key.toString('hex');
  var y = key_hex;
  console.assert(x === y, '\n' + x + '\n !== \n' + y);
});

并且控制台出现了这个断言错误:

AssertionError: 
efcca398dc0eb07aec6dcf2239dae83b79c2f82212b2cc0a21270fe251c73c7ab69f0133e75bf3ca6159242826ff3f26c64075f72cf86c67ba1199af29f6d576 
!== 
de3259de39fcc55531b91b4ffb2a6c29005c674cc95b3ec5bdf18412b6087d05921f3a0e4148fc34c88a04e980481d397a4c2b143edc0cb1bb5d7434ca3b4c25

如您所见,node.js 中的 key 以“efcca”开头,而 CryptoJS 中的 key 以“de325”开头。

错在哪里?也许这是一个不同的库实现?不应该是相同的派生 key 吗?

最佳答案

当你做的时候

var salt = CryptoJS.lib.WordArray.random(128 / 8);

你得到随机的字节。当您在 node.js 中将 salt 编码为 UTF-8 字符串时,它会产生与 node.js 的 crypto.pbkdf2 预期不同的编码。

改变

crypto.pbkdf2('anacleto', salt.toString('utf8'), 1, 512/8,

crypto.pbkdf2('anacleto', salt, 1, 512/8,

crypto.pbkdf2('anacleto', salt.toString('binary'), 1, 512/8,

关于javascript - Nodejs crypto.pbkdf2 结果不同于 CryptoJS.PBKDF2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32845912/

相关文章:

javascript - js无法访问Vue

node.js - 来自 node.js 应用程序的 ArangoDB 事务请求返回 403 : forbidden

node.js - Stripe 创建使用记录错误 - 时间戳必须在订阅的当前期间结束时间之前 - Date.now()?

Javascript:涉及I/O的有向树的DFS遍历

javascript - Angular, Material 形式只说提交尝试后需要字段

javascript - 尝试使用 React-Router 根据状态重定向用户时遇到问题

c# - 我应该为表中的密码字段使用什么? MD5 还是 SHA1?

java - 解码 ECDSA 失败,出现 : Exception in thread "main" java. security.SignatureException:错误解码签名字节

javascript - onClick 仅适用于所有其他 li

c++ - 解密过程中添加了多余的字母