首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs crypto.pbkdf2结果与CryptoJS.PBKDF2不同

Nodejs crypto.pbkdf2结果与CryptoJS.PBKDF2不同
EN

Stack Overflow用户
提问于 2015-09-29 13:57:12
回答 1查看 6K关注 0票数 8

我使用的是前端PBKDF2 (CryptoJS)和后端(Node.js),两个派生密钥必须相等,所以,我使用相同的盐分、相同的algo、相同的迭代次数、相同的密码,但是派生的密钥是不同的。

这是浏览器/加密is代码,在注释示例salt和key中。(六角)

代码语言:javascript
复制
<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代码

代码语言:javascript
复制
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);
});

控制台会产生这样的断言错误:

代码语言:javascript
复制
AssertionError: 
efcca398dc0eb07aec6dcf2239dae83b79c2f82212b2cc0a21270fe251c73c7ab69f0133e75bf3ca6159242826ff3f26c64075f72cf86c67ba1199af29f6d576 
!== 
de3259de39fcc55531b91b4ffb2a6c29005c674cc95b3ec5bdf18412b6087d05921f3a0e4148fc34c88a04e980481d397a4c2b143edc0cb1bb5d7434ca3b4c25

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-29 14:06:02

当你做的时候

代码语言:javascript
复制
var salt = CryptoJS.lib.WordArray.random(128 / 8);

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

变化

代码语言:javascript
复制
crypto.pbkdf2('anacleto', salt.toString('utf8'), 1, 512/8,

代码语言:javascript
复制
crypto.pbkdf2('anacleto', salt, 1, 512/8,

代码语言:javascript
复制
crypto.pbkdf2('anacleto', salt.toString('binary'), 1, 512/8,
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32845912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档