我有一个来自django的数据库,我想从Node.js使用它。我有一个任务:验证用户身份。从数据库中已知:算法pbkdf2_sha256,salt,10000次迭代和base64编码的哈希。我必须在JS中将一些密码编码为给定的base64-hash?
UPD:在这里找到了解决方案:python (django) hashlib vs Nodejs crypto但是Django生成的哈希和JS生成的哈希不匹配...
Django生成下一个:
pbkdf2_sha256$10000$NmzpPCQiTe2R$U8ipSsOy3Xz7FwWDHdH/dTei8Xh4Q7NGtdzrCacSfvo=
JS:
pbkdf2_sha256$10000$NmzpPCQiTe2R$w4jCgWjDilrDmcOBd8K+I8OdwpkKwoVQZMKWH3FvYcKoAMKcwqlewobDocOEGMKZfQ==
密码:Simple123
答案 0 :(得分:8)
通过使用pbkdf2-sha256(来自您自己的链接),我可以生成一个与Django相同的哈希值。
var pbkdf2 = require('pbkdf2-sha256');
var validatePassword = function (key, string) {
var parts = string.split('$');
var iterations = parts[1];
var salt = parts[2];
return pbkdf2(key, new Buffer(salt), iterations, 32).toString('base64') === parts[3];
};
var djangoPass = 'pbkdf2_sha256$10000$NmzpPCQiTe2R$U8ipSsOy3Xz7FwWDHdH/dTei8Xh4Q7NGtdzrCacSfvo=';
console.log(validatePassword('Simple123', djangoPass)); // Logs: true
以上代码应足以使用Node验证存储在Django中的密码。
答案 1 :(得分:2)
我最近创建了一个项目,以使这更容易。我的项目可用于节点,称为node-django-hashers
。代码如下:
https://github.com/kalvish21/hashers
示例用法:
var hashers = require('node-django-hashers');
var h = new hashers.PBKDF2PasswordHasher();
var hash1 = h.encode("password", h.salt());
console.log(h.verify("password", hash1)); // returns true
console.log(h.verify("wrong_password", hash1)); // returns false
这与django密码哈希兼容。
答案 2 :(得分:0)
我遇到了类似的任务,我必须使用Java对Django密码进行身份验证。在使用Django中的默认pbkdf2_sha256 hasher尝试实现此目标失败后,我最终更改了用于散列Django密码的方法,以便能够轻松地在Java中复制相同的算法。
如Django documentation中所述,您可以修改在settings.py中定义PASSWORD_HASHERS的顺序,我将此hasher放在第一位:
'django.contrib.auth.hashers.SHA1PasswordHasher'
以这种方式存储在Django数据库中的密码哈希是这样的:
sha1$upSZarr0w7CZ$304b22b1a9e7e5387e79f50e691043d3faf83c48
如果你已经在数据库中有一些密码,Django会在第一次用户登录时自动转换它们。
您可以使用$作为分隔符轻松地标记哈希值;第一个标记始终是sha1(使用的算法),第二个标记是 salt ,最后一个标记是实际的哈希。
要匹配密码,您可以验证
304b22b1a9e7e5387e79f50e691043d3faf83c48
是与预期密码连接的 salt 的SHA1总和:
SHA1(upSZarr0w7CZ + password) = 304b22b1a9e7e5387e79f50e691043d3faf83c48
在我们的案例中,使用较弱算法进行密码散列的安全隐患是可以接受的。
答案 3 :(得分:0)
pbkdf2-sha256(https://github.com/cryptocoinjs/pbkdf2-sha256)已弃用。我们应该使用pbkdf2(https://www.npmjs.com/package/pbkdf2)
var pbkdf2 = require("pbkdf2");
const password = "12345678";
const djangoPassword =
"pbkdf2_sha256$120000$uUjHWJsRsQj4$d9eBwNfRW/AayPOSMjqYyT26Sm6bsC5GCK9ntDxB8jM=";
var validatePassword = function(key, string) {
var parts = string.split("$");
var iterations = parts[1];
var salt = parts[2];
const hashPassword = pbkdf2
.pbkdf2Sync(key, Buffer.from(salt), Number(iterations), 32, "sha256")
.toString("base64");
return hashPassword === parts[3];
};
console.log(validatePassword(password, djangoPassword)); // it should be print "true"