PHP和Node.JS - 加密PBKDF2

时间:2016-07-25 15:22:08

标签: javascript php node.js

我试图让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不匹配?

2 个答案:

答案 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);
?>

Live example

在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中解决问题。

来源: https://nodejs.org/api/crypto.html#crypto_crypto_pbkdf2_password_salt_iterations_keylen_digest_callback