Python(Django)哈希库与Node.js加密模块的比较

10

我正在将一个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 代码不同。目前我已经迷失方向,希望能得到任何帮助。先谢谢了。


Node使用HMAC+SHA1,据我所知无法更改(而Python可以使用digest.sha1代替digest.sha256,但我不确定您是否接受这种方式)。 - robertklep
是的,我的当前密码是使用sha256创建的。 - imns
cryptojs 支持 HMAC+SHA256 的 PBKDF2,但仍然不能产生相同的结果。我认为 Django 使用了自己的实现,不太符合标准。 - robertklep
5个回答

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

谢谢@paldepind的帮助!但是pbkdf2-sha256模块已经被废弃了。虽然它被pbkdf2替代,但这也并不是必要的;Node提供了内置的crypto模块,其中包含一个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

1
我的解决方案是创建一个Python脚本,输入盐和用户密码,返回哈希密码。我从Node调用此脚本并解析结果。我检查哈希密码是否以pbkdf2_sha256开头,然后将其与Python脚本返回的值进行验证,如果验证通过,则使用我的新系统哈希函数重置密码。

1
请使用pbkdf2-sha256。我曾经遇到和你一样的问题(从Django到NodeJS)这个方法对我很有用! :)

0

根据bababa的回答,我的方法是创建一个Python脚本,同时使用

"from django.contrib.auth import hashers"

函数hashers.check_password()和hashers.make_password()提供了验证或创建密码以针对Django安装所需的功能。

有关这些函数的更多文档可以在https://docs.djangoproject.com/en/1.5/topics/auth/passwords/上找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接