我的用例是我需要将一些密码从 Keycloak 迁移到 Django。我在 Keycloak 上的示例密码是“qwerty123”。 Keycloak DB中生成的对应哈希是这样的:
{"value":"PQzhC1QBMBHY/wBUZB4iWV0jtJHmFoHaGBgps9GGrIAeLSIQqzteNquvTgbuooPnltGB6EBpu3f+itYV8VMdcw==","salt":"ORBgqQI7lghE24ggYg+14A==","additionalParameters":{}}
但是,如果我以 Django 密码哈希器指定的格式将其直接粘贴到数据库中,即
pbkdf2_sha265$27500$ORBgqQI7lghE24ggYg+14A==$PQzhC1QBMBHY/wBUZB4iWV0jtJHmFoHaGBgps9GGrIAeLSIQqzteNquvTgbuooPnltGB6EBpu3f+itYV8VMdcw==
我收到密码不匹配错误。我尝试在 Python 中追溯密码哈希器,发现它生成的哈希值与我插入的哈希值不同。我做了:
...: from django.utils.crypto import pbkdf2
...: import hashlib
...: import base64
...:
...: secret = 'qwerty123'
...: salt = 'ORBgqQI7lghE24ggYg+14A=='
...: iterations = 27500
...: digest = hashlib.sha256
...: pwd_hash = pbkdf2_hmac(hashlib.sha256, secret, salt , iterations, 512)
...: pwd_hash = base64.b64encode(pwd_hash).decode('ascii').strip()
...: print(pwd_hash)
我在这里得到的输出是:
'yD/EY8mV0OPx0qv5ZGJDq1hyJ+QhIc8KTnITO1rDgzmVJwe/xM6by5VCyG84C9fBILX5UGNQwHGmYYqhDY1Ww2xoHjOXg/WrHlwEn+PU32/lJ4OwepbffPV/kHo+9Y1wxSFdx8zIiw992yIuh9d0A70u7822WFZJDcym1WSQZq/YMa6F+xUxMhEakHGQYth5CPsyCxWkQu1YgiM3KjRty/jfL7r8m+5f6PgBEKBYu0dtYc8QjWU+vSR8Nexz8EwHjIAhhA2iL2zGez+EfGLInDlON+QwffevKEQJnkld2gBp7Liz1Bd9rZjg0smy72nxFiR5gP+ZCTVEmS3e3bMnIGNGegrI6XxitdK2KIeSO+YfTFqVEF5zoNdjE5cx31TS1svcMAcf4uedJo+kARBw7oNOvACVrHMBUpmT5Vc+eaf/is8lzz6xEP97dfsiHZoegW2wJpWYl762NaVthKc1mThEblNsXTqrZRjH0OE6MXInpiwq+mn4TSt8epFMnYKfo5i6ektvbrwS3kJnU2wqJ7XP9lZH3Q7Lw7P2X8B/uaBhyePnJO2L84yqqfforwim8cYOWotdz30V7m2/xLukJiWWpK40ivkaGErzpbO1j4mMUYR+bsY4Fu3KD7TNLlJasDzPo7EIw1AwueS/k+n9Ucu2PBqf/WARKeYWbL3Yit0='
我还尝试重新创建 django 密码哈希器代码:
...: hash = pbkdf2(secret, salt, iterations, digest=digest)
...: hash = base64.b64encode(hash).decode('ascii').strip()
...: print(hash)
其输出为:
'yD/EY8mV0OPx0qv5ZGJDq1hyJ+QhIc8KTnITO1rDgzk='
这与 Keycloak 生成的哈希值相差甚远,有人能告诉我我究竟犯了什么错误吗?任何帮助将不胜感激。
我试图检查 Keycloak 在存储到数据库之前是否进行了一些后处理,所以我检查了这个哈希值8gwifi.org https://8gwifi.org/pbkdf.jsp。它会生成一个与 Keycloak 上存储的哈希值相同的哈希值。所以 Python 也应该能够得到相同的哈希值。截图自8gwifi https://i.stack.imgur.com/7U0uw.png