2016-07-25 136 views
0

我想让Node.JS Crypto PBKDF2匹配来自PHP Crypto PBKDF2的相同值。出于某种原因,它是不一样的。PHP和Node.JS - 加密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?

回答

1

您可以使用在PHP raw_output的hash_pbkdf2方法的选项,并比较他们的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')); 
}); 
+0

谢谢,这似乎工作!是否有可能在JavaScript中使用password_hash()做些事情? –

+0

不客气。你想用password_hash()做什么? –

+0

当通过password_hash()生成散列时,JS应该验证在PHP中创建的哈希密码。 –

0

PHP字符串是十六进制格式。 Node.JS字符串不是。

UPDATE:key.toString('hex')在JS中解决了这个问题。

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

+0

我曾尝试转换为十六进制和也的base64,仍然不匹配。 –

+0

我从文档中添加一些代码,它必须解决您的问题。 –

+0

这似乎工作,但在JS上它显示比PHP更长的散列。在PHP'3745e482c6e0ade35da1',但在JS:'3745e482c6e0ade35da10139e797157f4a5da669' –