gpt4 book ai didi

python - 如何使用 Node.js 验证 Python Passlib 创建的加密哈希?

转载 作者:行者123 更新时间:2023-11-30 23:13:17 24 4
gpt4 key购买 nike

我有一个用 Python 编写的后端应用程序,供我网站的内容管理员使用。用户的密码使用 passlib's pbkdf2_sha512 进行哈希处理功能。我开始开发前端应用程序,出于用户体验的原因,我决定将 Nodejs 与 React 结合使用。

现在我的问题是我不知道如何使用 nodejs 验证 passlib 散列的密码来验证我的用户。 Passlib 的实现对我来说似乎太具体了,而且我不太喜欢加密的东西来弄清楚它。

我有 MCF,所以我知道算法和摘要类型、盐、迭代次数和 key 长度。如何验证 Node 中 passlib 的输出?我应该选择两个平台都更好支持的另一种算法吗?

最佳答案

我们遇到了完全相同的问题,但切换到 sha512crypt 不是一个选择。在我们的例子中,密码是使用 Flask-security 生成的。下面的示例涵盖常规 passlib 和flask-security 哈希,它们首先生成带有 secret 盐的 HMAC 并将其用作 pbkdf2-sha512 密码。请参阅下面的代码。

来源位于 GitHub:https://github.com/badzong/node-verify-flask-security-passwords

var crypto = require('crypto');
var pbkdf2_sha512 = require('pbkdf2-sha512');

function b64trimmed(buf) {
return buf.toString('base64').replace(/=*$/, '').replace('+', '.');
}

function b64decode(str) {
// . in Base64?
str = str.replace('.', '+');
if (str.length % 4) {
str += '='.repeat(4 - str.length % 4);
}
return new Buffer(str, 'base64');
}

function get_hmac(secret, password) {
var hmac = crypto.createHmac('sha512', secret).update(password).digest('base64');

return hmac;
}

function get_hash(password, salt, rounds) {

// FIXME: KeyLenBytes is hardcoded
var h = b64trimmed(pbkdf2_sha512(password, salt, rounds, 64));
var joined_hash = ['', 'pbkdf2-sha512', rounds, b64trimmed(salt), h].join('$');

return joined_hash;
}

function verify_hash(password, stored_hash) {
var scheme = stored_hash.split('$')[1];
var rounds = stored_hash.split('$')[2];
var salt = stored_hash.split('$')[3];

// FIXME: Maybe throw an exception
if (scheme !== 'pbkdf2-sha512') {
return false;
}

var h = get_hash(password, b64decode(salt), rounds);

return h === stored_hash;
}

function new_hash(password, rounds) {

// FIXME: Salt size is hardcoded
var salt = crypto.randomBytes(16);

return get_hash(password, salt, rounds);
}

var password = 'Example Password';

// Usage:
var h = new_hash(password, 20000);
console.log('HASH ' + h);
console.log('VERIFY ' + verify_hash(password, h));

// Usage for passwords generated with flask_security:

// SECURITY_PASSWORD_SALT is set in config.py and used by flask-security
var SECURITY_PASSWORD_SALT = 'Many random bytes...';

var password_hmac = get_hmac(SECURITY_PASSWORD_SALT, password);
var h = new_hash(password_hmac, 20000);
console.log('HASH ' + h);
console.log('VERIFY ' + verify_hash(password_hmac, h));

关于python - 如何使用 Node.js 验证 Python Passlib 创建的加密哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29391615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com