我正在将Django站点移植到Node.js,我正在尝试在Node中重新实现Django set password方法。这是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代码相同的结果。在这一点上,我几乎在我的头上,任何帮助都将非常感激。提前谢谢。
答案 0 :(得分:6)
以下是使用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;
以上代码应足以使用Node验证存储在Django中的密码。
答案 1 :(得分:1)
所以我的解决方案是创建一个python脚本,它接受salt和用户密码并返回哈希密码。我从节点调用此脚本并解析结果。我检查散列密码是否以:pbkdf2_sha256开头,然后我根据我的python脚本返回的内容验证它,如果它验证使用我的新系统散列函数来重置密码。
答案 2 :(得分:1)
请改用pbkdf2-sha256。有你遇到的完全相同的问题(Django - > NodeJS),这对我有用! :)
答案 3 :(得分:0)
根据bababa的回答,我的方法是使用
创建一个Python脚本“来自django.contrib.auth导入哈希”
函数hashers.check_password()和hashers.make_password()提供了验证或创建Django安装密码所需的功能。
有关此功能的更多文档可在https://docs.djangoproject.com/en/1.5/topics/auth/passwords/
上找到答案 4 :(得分:0)
谢谢@paldepind的回答对我有所帮助!但是,不建议使用pbkdf2-sha256模块。并且尽管将其替换为pbkdf2,但这也不是必须的; Node为内置的加密模块提供了pbkdf2函数,如果您为其提供正确的参数,该函数将起作用。这是带有OP密码的代码。我还用自己的密码验证了此代码:
const crypto = require("crypto");
// Given the following password, using algorithm pbkdf2_sha256:
// pbkdf2_sha256$10000$p9Tkr6uqxKtf$9OTqv/1X3jvhdyWRm1vwQzMYO9cOzth7hYpoFe0qboA=
var password = "text1";
var salt = "p9Tkr6uqxKtf";
var iterations = 10000;
crypto.pbkdf2(password, salt, iterations, 32, "sha256", (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString("base64"));
});
您也可以使用pbkdf2Sync。