php和node.js之间的pbkdf2差异

我使用Node.js使用pbkdf2生成密码散列并将它们存储到数据库中。 另外我正在做一些用PHP制作的网页,让你用户重置他们的密码,所以除非我在node.js中使用web服务来构build哈希,我想在2个系统中运行该algorithm。 不幸的是,似乎我得到了不同的结果,我不能混合这两个库。 我在node.js中使用的代码使用模块password-hash-and-salt,基本上调用crypto.pbkdf2,而php使用hash_pbkdf2。

这些是我用来testing它的脚本:

PHP:

<?php $password = $argv[1]; $iterations = 10000; $length = 64; $salt = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); $key = hash_pbkdf2("sha256", $password, $salt, $iterations, $length,true); echo "HASH: pbkdf2\\$" . $iterations . "\\$" . bin2hex($key) . "\\$" . bin2hex($salt). "\n"; echo "Key length: " . strlen(bin2hex($key)) . "\n"; echo "Hash length: " . strlen(bin2hex($salt)) . "\n"; ?> 

Node.js的:

 var crypto = require('crypto'); var request = require('request'); var hasher = require('password-hash-and-salt'); if (process.argv[2] == 'generate') { var password = process.argv[3]; console.log("Generating hash for password " + password); hasher(password).hash(function(err, hash) { if (err) { console.log(err); } else { console.log("Result: " + hash); } }); } else { var password = process.argv[3]; var hash = process.argv[4]; console.log("Testing " + password + " against " + hash); hasher(password).verifyAgainst(hash, function(error, verified) { if (error) console.log(error); else { console.log("Verification result: " + verified); } }); } 

NODE.JS LIB部分:

 var calcHash = function() { crypto.pbkdf2(password, salt, iterations, 64, function(err, key) { if(err) return callback(err); var res = 'pbkdf2$' + iterations + '$' + key.toString('hex') + '$' + salt.toString('hex'); callback(null, res); }) }; if(!salt) { crypto.randomBytes(64, function(err, gensalt) { if(err) return callback(err); salt = gensalt; calcHash(); }); } else { calcHash(); } 

有人可以告诉我我做错了什么,或algorithm不兼容?

谢谢!

NodeJS PBKDF2默认为SHA-1,这应该解释差异。

我强烈build议您直接使用NodeJS PBKDF2function。 你的JS包装器(你不链接到)也使用它,它只是一个小的包装库。