Python (Django) hashlib 与 Nodejs crypto

10 投票
5 回答
2928 浏览
提问于 2025-04-17 18:59

我正在把一个Django网站迁移到Node.js,并且我想在Node中重新实现Django的设置密码方法。这是Django的代码:

from django.utils.crypto import (
    pbkdf2, get_random_string)

import hashlib

password = 'text1'
algorithm = "pbkdf2_sha256"
iterations = 10000
salt = 'p9Tkr6uqxKtf'
digest = hashlib.sha256
hash = pbkdf2(password, salt, iterations, digest=self.digest)
hash = hash.encode('base64').strip()
print "%s$%d$%s$%s" % (self.algorithm, iterations, salt, hash)

这是我目前在Node.js中写的代码:

var password = 'text1';
var hashed = crypto.createHash('sha256').update(password, 'utf8').digest();
var salt = 'p9Tkr6uqxKtf';
var algorithm = "pbkdf2_sha256";
var iterations = 10000;
crypto.pbkdf2(hashed, salt, iterations, 32, function(err, encodedPassword) {
    var newPass = new Buffer(encodedPassword).toString('base64');
    console.log(encodedPassword);

    // console.log(Buffer(encodedPassword, 'binary').toString('hex'));
    var finalPass = algorithm +'$'+ iterations +'$'+  salt +'$'+  newPass;
    console.log(finalPass);
});

我在Node中的解决方案输出的结果和Python/Django的代码不一样。现在我有点无从下手,任何帮助都非常感谢。提前谢谢大家。

5 个回答

1

可以试试用 pbkdf2-sha256。我之前也遇到过你一样的问题(从Django转到NodeJS),这个方法对我有效! :)

1

我的解决办法是写了一个Python脚本,这个脚本会接收盐值和用户的密码,然后返回一个加密后的密码。我从Node.js中调用这个脚本,并解析它的结果。我会检查这个加密后的密码是否以“pbkdf2_sha256”开头,如果是的话,就用我Python脚本返回的结果进行验证。如果验证通过,我就用我新系统的加密方法来重置密码。

7

这里有一个更好的解决方案,使用了 pbkdf2-sha256

var pbkdf2 = require('pbkdf2-sha256');
var password = 'text1';
var salt = 'p9Tkr6uqxKtf';
var algorithm = "pbkdf2_sha256";
var iterations = 10000;
var hashed = pbkdf2(password, new Buffer(salt), iterations, 32).toString('base64');
var finalPass = algorithm +'$'+ iterations +'$'+  salt +'$'+  hashed;

上面的代码应该足够用来验证存储在Django中的密码,使用Node来实现。

撰写回答