如何手动为 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);
});
干杯!