我试图让Node.JS Crypto PBKDF2匹配来自PHP Crypto PBKDF2的相同值。出于某种原因,它不一样。
在JavaScript中
const crypto = require('crypto');
crypto.pbkdf2('secret', 'salt', 100000, 20, 'sha512', (err, key) => {
console.log(key.toString());
});
输出:7E������]�9��J]�i
在PHP中
$password = "secret";
$iterations = 100000;
$salt = "salt";
$hash = hash_pbkdf2("sha512", $password, $salt, $iterations, 20);
echo $hash;
输出:3745e482c6e0ade35da1
为什么JS输出与PHP不匹配?
答案 0 :(得分:1)
您可以在PHP中使用hash_pbkdf2方法的 raw_output 选项并比较它们的base64
在PHP中
<?php
$password = "secret";
$iterations = 100000;
$salt = "salt";
$hash = hash_pbkdf2("sha512", $password, $salt, $iterations, 20, true);
echo base64_encode($hash);
?>
在NodeJS
const crypto = require('crypto');
crypto.pbkdf2('secret', 'salt', 100000, 20, 'sha512', (err, key) => {
console.log(new Buffer(key).toString('base64'));
});
答案 1 :(得分:0)
PHP字符串是十六进制格式。 Node.JS字符串isn&#t; t。
更新: key.toString('hex')
在JS中解决问题。