【问题标题】:python (django) hashlib vs Nodejs cryptopython (django) hashlib vs Nodejs 加密
【发布时间】:2013-03-01 23:18:17
【问题描述】:

我正在将 Django 站点移植到 Node.js,并且我正在尝试在 Node.js 中重新实现 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,但我不确定是否这是你可以接受的)。
  • 是的,我当前的密码是用 sha256 创建的。
  • cryptojs 支持带有 HMAC+SHA256 的 PBKDF2,但它仍然不会产生相同的结果。我认为 Django 使用自己的实现,但并不十分标准。

标签: python django node.js hashlib passport.js


【解决方案1】:

这是使用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 中的密码。

【讨论】:

    【解决方案2】:

    所以我对此的解决方案是创建一个 python 脚本,该脚本接受盐和用户密码并返回散列密码。我从节点调用这个脚本并解析结果。我检查哈希密码是否以:pbkdf2_sha256 开头,然后根据我的 python 脚本返回的内容验证它,如果它验证使用我的新系统哈希函数来重置密码。

    【讨论】:

      【解决方案3】:

      请改用pbkdf2-sha256。遇到了您正在处理的完全相同的问题(Django -> NodeJS),这对我有用! :)

      【讨论】:

        【解决方案4】:

        按照 bababa 的回答,我的方法是创建一个 Python 脚本以及使用

        “从 django.contrib.auth 导入哈希”

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

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

        【讨论】:

          【解决方案5】:

          感谢@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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-05-13
            • 2011-06-16
            • 1970-01-01
            • 2019-11-04
            • 2021-09-15
            • 1970-01-01
            • 2013-04-04
            • 2017-08-28
            相关资源
            最近更新 更多