将哈希密码从flask导入Django

2024-09-28 11:41:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须将我的flask用户迁移到django。在flask中,我使用werkzeug库生成了密码,如:

generate_password_hash(value, method='sha256')

在django导入中,我保存了密码:

u.password = hashed_pw

现在,密码位于数据库中,如下所示:

'sha256$VSvtvATP$2c87cf...'

现在django无法验证我的密码。我如何转换密码以便django能够处理它


Tags: django用户数据库密码flaskvaluepasswordhash
2条回答

flask和django使用hashlib.pbkdf2_hmac生成密码散列。不同之处在于格式和编码。因此,可以透明地将密码哈希从一种格式转换为另一种格式。(我想知道为什么不均匀,减少摩擦)

def trans_hash(str):
        """from flask to django"""
        [alg, _hash_alg, rest] = str.split(':')
        [iteration, salt, hashed] = rest.split('$')
        # in flask hex() formated, so decode using b16decode
        # https://github.com/pallets/werkzeug/blob/main/src/werkzeug/security.py#L162
        raw_hash = base64.b16decode(hashed.strip().encode('ascii').upper())
        # in django, use b64encode, https://github.com/django/django/blob/ca9872905559026af82000e46cde6f7dedc897b6/django/contrib/auth/hashers.py#L276
        hashed = base64.b64encode(raw_hash).decode('ascii').strip()
        rest = '$'.join([iteration, salt, hashed] )
        return f"{alg}_{_hash_alg}${rest}"

flask中的密码哈希:

pbkdf2:sha256:150000$zwBNBm5i$be85b2739ab81c94ea2596fe79c0f6e7d211561f5ea1525c5620e817ef3ea82b

将翻译为(django)

pbkdf2_sha256$150000$zwBNBm5i$voWyc5q4HJTqJZb+ecD259IRVh9eoVJcViDoF+8+qCs=

Django默认使用不同的密码散列算法,即PBKDF2和SHA-256。将现有散列移到Django的唯一方法是告诉它使用不同的散列器。普通的SHA-256哈希程序不是内置的,所以您必须write your own


不过,我会考虑不这样做,并为您现有的用户提供迁移路径,因为PBKDF2-SAH256被认为更安全:

将这些散列存储在用户的另一个字段中,并在首次登录时提示他们更改密码(然后扔掉旧散列,只保存以Django方式散列的密码)。您甚至可以对您的用户透明地执行此操作(即,在第一次登录时,在检查哈希与Flask中的旧哈希匹配后,基于相同的密码(此时您拥有的密码)生成一个新哈希并存储它,然后丢弃旧哈希

相关问题 更多 >

    热门问题