我有一个旧数据库,其中用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)
但是我无法使用测试用户登录。
有什么想法吗? :/
答案 0 :(得分:0)
恐怕您无法做到这一点。散列严格来说是单向的,因此无法将一种散列转换为另一种散列。当用户登录时,您将必须一次将这些密码更新为新的哈希。
实施此更改的合适策略是:
重要提示:在将其发布之前,您将需要对其进行彻底的测试。如果输入有误,则可能会破坏任何登录用户的凭据。我建议暂时保留旧的md5哈希值的副本,直到确认生产稳定为止,但绝对确定要完全销毁该副本。只要存在md5哈希,您的用户密码就不安全。