python - django:将无盐 md5(无盐)哈希转换为 pbkdf2

标签 python django

我有一个旧数据库,其中用户密码使用 md5 进行哈希处理,不加盐。现在我正在将项目转换为 django,需要更新密码而不要求用户登录。

我写了这个哈希器:

from django.contrib.auth.hashers import PBKDF2PasswordHasher

class PBKDF2WrappedMD5PasswordHasher(PBKDF2PasswordHasher):
    algorithm = 'pbkdf2_wrapped_md5'

    def encode_md5_hash(self, md5_hash, salt):
        return super().encode(md5_hash, salt) 

并转换密码,例如:

for data in old_user_data:
    hasher = PBKDF2WrappedMD5PasswordHasher()
    random_salt = get_random_string(length=8)
    # data['password'] is e.g. '972131D979FF69F96DDFCC7AE3769B31'
    user.password = hasher.encode_md5_hash(data['password'], random_salt)

但我无法使用我的测试用户登录。

有什么想法吗? :/

最佳答案

恐怕你不能用这个做你想做的事。散列是严格单向的,因此无法从一种散列转换为另一种散列。当用户登录时,您必须将这些密码一一更新为新的哈希值。

实现此更改的一个不错的策略是:

  1. 将所有现有哈希值标记为 md5。您可以只使用某种 bool 标志/列,但对此有一个公认的标准:https://passlib.readthedocs.io/en/stable/modular_crypt_format.html
  2. 当用户登录时,首先检查他们拥有哪种类型的哈希值,然后计算该哈希值,以对其进行身份验证。如果还是md5,则计算md5进行登录;如果他们现在使用 pbkdf2,则计算该哈希值。
  3. 验证密码后,如果它们仍然标记为 md5,请计算新格式哈希并替换它 - 确保现在将其标记为 pbkdf2。

重要提示:在将其释放到野外之前,您需要对其进行彻底的测试。如果您犯了错误,您可能会销毁任何登录用户的凭据。我建议暂时保留旧 md5 哈希值的副本,直到您确认生产稳定为止,但要绝对确定您完全销毁了该副本。只要 md5 哈希值存在,您的用户密码就不安全。

关于python - django:将无盐 md5(无盐)哈希转换为 pbkdf2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56144262/

相关文章:

python - ttk 样式 "TNotebook.Tab"背景和边框宽度不起作用

python - 在不同的目录中创建共享部分包结构的多个 Python 模块

python - 呈现嵌入式表单集 management_form 时出现 django mongodbforms 异常

带关键字的 Django 模型过滤器

django - 序列化程序 - Django REST Framework - 序列化程序字段可能命名不正确,并且与 `str` 实例上的任何属性或键都不匹配

Python 函数的 __dict__

python - 字符串编码和解码?

python - 如何在 Python 中创建全局类(如果可能)?

python - Pandas :将多索引级别作为系列

python-3.x - 如何在Django中使用注释来计算外键对象?