适用于 Django 的 Python 密码生成器



如何手动为 django 生成密码?例如,在其他应用程序中,但使用与 django 相同的数据库。对于像这样的用户名"admin"密码

pbkdf2_sha256$10000$T0BzrDwfZSrI$pSgvDEam9V9jcdYpYDVkYMMwtSnRrFdf6Aqow82Tjr8=

我认为这可能是您正在寻找的:

手动管理用户的密码

make_password(密码[,盐,哈希器](

在 中创建散列密码 此应用程序使用的格式。它需要一个强制性参数: 纯文本形式的密码。或者,您可以提供盐和 要使用的哈希算法,如果您不想使用默认值(首先 PASSWORD_HASHERS设置的输入(。当前支持的算法 分别是:"pbkdf2_sha256"、"pbkdf2_sha1"、"bcrypt_sha256"(请参阅使用 bcrypt 与 Django(、'bcrypt'、'sha1'、'md5'、'unsalted_md5'(仅适用于 向后兼容性(和"crypt"(如果您有 crypt 库( 安装。如果密码参数为"无",则密码不可用 返回(一个永远不会被 check_password(( 接受的(。


我想要在没有 django 的情况下使用的编写函数

幸运的是,Django 是开源的,所以你可以去拿你需要的东西。函数源在此处可见。

最常见(不是最安全(的哈希算法是 md5 。从 Django 的密码系统中提取一些想法可以是以下代码:

import hashlib
def make_password(password):
    assert password
    hash = hashlib.md5(password).hexdigest()
    return hash
def check_password(hash, password):
    """Generates the hash for a password and compares it."""
    generated_hash = make_password(password)
    return hash == generated_hash

>>> hash = make_password('hello123')
>>> hash
'f30aa7a662c728b7407c54ae6bfd27d1'
>>> check_password(hash, 'hello123')
True
>>> check_password(hash, 'Hello123')
False

使用 make_password 生成哈希,check_password检查输入的密码是否与存储的密码相同。

正如@Emil指出的那样,Django 支持多个密码哈希器,例如 pbkdf2_sha256 和 pbkdf2_sha1,将字符串存储为由 $algorithm$salt$hash 分隔的 3 倍值。 salt 是一个随机生成的字符串,用于防止相同的密码在数据库中重复。

我有这个工作节点脚本,也许它可以帮助那里的人:

const crypto = require('crypto');
const djangoIterations = 260000; //Default for Django 3.2 (its increased to 480000 for new django versions)
function generateSalt(length) {
  return crypto.randomBytes(length).toString('base64');
}
function djangoHash(password, iterations = djangoIterations, salt = generateSalt(12)) {
  return new Promise((resolve, reject) => {
    const keylen = 32;
    const digest = 'sha256';
    console.log(`Hashing password with ${iterations} iterations`);
    console.log(`Salt: ${salt}`);
    crypto.pbkdf2(password, salt, iterations, keylen, digest, (err, derivedKey) => {
      if (err) reject(err);
      else resolve({
        algorithm: 'pbkdf2_sha256',
        iterations: iterations,
        salt: salt,
        hash: derivedKey.toString('base64'),
      });
    });
  });
}
djangoHash('my_password').then(({algorithm, iterations, salt, hash}) => {
  console.log(`Hash ${hash}`);
  const fullHash = `${algorithm}$${iterations}$${salt}$${hash}`;
  console.log(fullHash);
}).catch(err => {
  console.error(err);
});

干杯!

最新更新