django:将未加盐的md5(不含盐)哈希值转换为pbkdf2

时间:2019-05-15 07:58:18

标签: 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 个答案:

答案 0 :(得分:0)

恐怕您无法做到这一点。散列严格来说是单向的,因此无法将一种散列转换为另一种散列。当用户登录时,您将必须一次将这些密码更新为新的哈希。

实施此更改的合适策略是:

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

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