9

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

pbkdf2_sha256$10000$T0BzrDwfZSrI$pSgvDEam9V9jcdYpYDVkYMMwtSnRrFdf6Aqow82Tjr8=
4

2 回答 2

14

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

手动管理用户密码

make_password(密码[, salt, hashers])

以该应用程序使用的格式创建一个散列密码。它需要一个强制性参数:纯文本密码。或者,如果您不想使用默认值(PASSWORD_HASHERS 设置的第一个条目),您可以提供要使用的盐和散列算法。当前支持的算法有:'pbkdf2_sha256'、'pbkdf2_sha1'、'bcrypt_sha256'(参见 Using bcrypt with Django)、'bcrypt'、'sha1'、'md5'、'unsalted_md5'(仅用于向后兼容)和 'crypt' if你已经安装了 crypt 库。如果密码参数为无,则返回不可用的密码(check_password() 永远不会接受的密码)。


我想编写不使用 django 的函数

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

于 2013-09-30T15:49:12.457 回答
2

最常见(不是最安全)的散列算法是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,将字符串存储为由$:分隔的 3 倍值algorithm$salt$hashsalt是一个随机生成的字符串,用于防止相同的密码在数据库中重复。

于 2013-09-30T16:29:46.877 回答