php和node.js之间pbkdf2的差异

时间:2015-12-06 19:49:45

标签: php node.js cryptography pbkdf2

我使用Node.js使用pbkdf2生成密码哈希并将其存储到数据库中。此外,我还制作了一些用php制作的网页,让用户可以重置密码,所以除非我在node.js中使用web服务来构建哈希,否则我希望算法在2个系统中运行。不幸的是,我得到了不同的结果,我无法混合这两个库。我在node.js中使用的代码使用模块password-hash-and-salt,它基本上调用crypto.pbkdf2,而php使用hash_pbkdf2。

这些是我用来测试它的脚本:

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 PART:

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();
            }           

有人可以告诉我我做错了什么或算法不兼容吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

我强烈建议您直接使用NodeJS PBKDF2功能。你的JS包装器(你没有链接到它)也使用它,它只是一个小的包装器lib。