2016-07-25 45 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' –