对于给定的密码和盐,Python 不会派生出与 Keycloak 或在线密码哈希器相同的哈希键

2024-01-16

我的用例是我需要将一些密码从 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


为了让 Python 代码返回 Keycloak 哈希值,salt 必须经过 Base64 解码,并且密钥大小必须以字节而不是位为单位指定:

import base64 
 
digest = 'sha256'
secret = b'qwerty123' 
salt = base64.b64decode(b'ORBgqQI7lghE24ggYg+14A==')  # Fix 1: Base64 decode to get the salt
iterations = 27500 
keysize = 512//8 # Fix 2: Pass key size in bytes

# hashlib -------------------------------------------------------

import hashlib 
      
pwd_hash = hashlib.pbkdf2_hmac(digest, secret, salt, iterations, keysize)
pwd_hash = base64.b64encode(pwd_hash).decode('ascii')

assert pwd_hash == 'PQzhC1QBMBHY/wBUZB4iWV0jtJHmFoHaGBgps9GGrIAeLSIQqzteNquvTgbuooPnltGB6EBpu3f+itYV8VMdcw=='
print('Hashes match')

# PyCryptodome --------------------------------------------------

from Crypto.Protocol.KDF import PBKDF2
from Crypto.Hash import SHA256

pwd_hash2 = PBKDF2(secret, salt, keysize, iterations, hmac_hash_module=SHA256)
pwd_hash2 = base64.b64encode(pwd_hash2).decode('ascii')

assert pwd_hash2 == 'PQzhC1QBMBHY/wBUZB4iWV0jtJHmFoHaGBgps9GGrIAeLSIQqzteNquvTgbuooPnltGB6EBpu3f+itYV8VMdcw=='
print('Hashes match')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于给定的密码和盐,Python 不会派生出与 Keycloak 或在线密码哈希器相同的哈希键 的相关文章

随机推荐

  • Postgresql 增量物化视图维护 (IVM) 挑战,为什么再次推迟到目标版本 16? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 来自 commit fest 的最新消息https wiki postgresql org wiki Incremental View Main
  • 在进程启动之前向进程注入 dll 的优雅方法

    我正在制作一个 mod dll 来修改目标进程的行为 我成功地注入了我的dll并挂钩了目标的一些函数 但是 当我需要在主模块启动之前 更清楚地说 在入口点之前 挂钩一些 API 时 需要做更多的工作 我需要使用 CREATE SUSPEND
  • 如何将 270 度旋转的文本对齐到左上角?

    这应该是一个你会想到的非常简单的问题 我有一个带有一些标题文本的框 我想将其旋转 90 度 我希望它是绝对定位的 以便单词的末尾被轻推到左上角 我可以很容易地将其对齐到底部 但问题是 对于可变长度文本 在对齐到顶部时似乎不可能始终将其保留在
  • Java 中的日语字符编码

    这是我的问题 我现在正在使用 Java Apache POI 读取 Excel xls 或 xlsx 文件 并显示内容 电子表格中有一些日语字符 我得到的所有日语字符都是 在我的输出中 我尝试过使用Shift JIS UTF 8等多种编码方
  • 抽象超类中的通用 @Inject'd 字段

    考虑一组类似 MVP 的类型 存在一个抽象的 Presenter 带有一个 View 接口 public interface View public abstract class AbstractPresenter
  • 在 TextView 中省略文本大小而不指定 maxLines

    我有一个 TextView 其高度会根据屏幕中的其他组件而变化 我要在此 TextView 中设置很长的文本 因此我想省略它 简单地指定 android ellipsize end 是行不通的 只有同时指定 maxLines 时 椭圆化才起
  • 将图像序列转换为视频文件 android java

    我知道这是一个老问题 我对此进行了很多研究 但似乎没有适当的解决方案 我已经看到了一些方法可以做到这一点 例如 使用 FFmpeg 但它取决于本机代码 所以对我来说不是一个选择 Xuggler API 与上面的原因相同 我正在寻找可以将多个
  • 如何使用R连接两台计算机?

    是否可以在两台不同计算机上的两个 R 会话之间打开通信流 如果会话位于同一台计算机上 我使用套接字来连接会话 我想对于两台不同的计算机 我应该尝试网络套接字 httpuv支持 R 作为 Web 套接字服务器 但不幸的是 我找不到任何支持 R
  • WPF MVVM 在代码后面绑定动态控件并传入View

    我正在使用 MVVM 开发 WPF 应用程序 我有两页 我在第 1 页中有多个 UserControl 在从第 1 页选择 UserControl 时 我想在第 2 页中显示所选的 userControl 下面是我的代码 视图模型代码 pu
  • 无法在 Android Studio 中启动模拟器

    我尝试在 ubuntu 14 04 中的 android Studio 模拟器中启动应用程序 它显示以下错误 gradle 构建过程中显示错误 home next NTE MachineSetup android sdk linux too
  • JSF 和 f:ajax 用于隐藏/显示 div

    我正在考虑在我的网络应用程序上制作一个可隐藏 可显示的菜单 在此之前 我为此目的广泛使用了 PHP 和 AJAX 然而 由于 HTML 元素 id 在 JSF 框架中重新生成 我发现这种方法至少在我的范围内不再可行 我已经阅读了 JSF 中
  • AMD 结构化网络应用程序中的 Mixpanel 2.2 - 例如需要.js

    我正在尝试在基于 Backbone js 和 require js 的单页面站点中使用 Mixpanel 事件跟踪 看着snippet https mixpanel com help reference tracking an event
  • PHP - preg_match - 如何将字符串大写/小写与其之前或之后的任何内容匹配?

    我有一个函数的一部分 如下所示 if preg match bscript b userInput bannedWord script logHax return TRUE 这给我想要完成的任务带来了问题 因为它只会匹配确切的单词 scri
  • C# 自定义属性必需如果

    我刚刚开始接触自定义属性 我非常喜欢它们 我想知道是否可以创建一个应用于属性并表示同一对象中另一个属性的名称的属性 如果会检查引用的属性是否有值 如果有 则需要装饰属性 像这样的东西 RequiredIfNotNull ApprovedDa
  • 距某一点最近的地点

    我有下表 create table places lat lng point place name varchar 50 insert into places values POINT 126 4 45 32 Food Bar 要获取靠近特
  • toDF 的值不是 org.apache.spark.rdd.RDD 的成员

    我在其他帖子中读到过这个问题 但我仍然不知道我做错了什么 原则上 添加这两行 val sqlContext new org apache spark sql SQLContext sc import sqlContext implicits
  • 拍照后如何从 ImageView 保存图像

    我从图库中挑选照片或用相机拍摄 如果我将图片放入 imageView 中 然后单击确认按钮 我该如何保存该图片 我必须使用 saveState 吗 请发表一些评论 谢谢 protected void onActivityResult int
  • 错误页面上的错误报告表格

    我在 JBoss 7 1 和 Richfaces 4 1 中有一个 JSF Web 应用程序 我尝试在 web xml 中配置自定义错误页面 但遇到了问题 这不适用于 AJAX 请求 作为我尝试使用的解决方案Omnifaces FullAj
  • 空无限循环和GC(JVM)。请说明一下效果

    我的空无限循环 public static void main String args while true And profiling in Java VisualVM picture 正如你所看到的 我不创建对象 为什么要改变堆 请解释
  • 对于给定的密码和盐,Python 不会派生出与 Keycloak 或在线密码哈希器相同的哈希键

    我的用例是我需要将一些密码从 Keycloak 迁移到 Django 我在 Keycloak 上的示例密码是 qwerty123 Keycloak DB中生成的对应哈希是这样的 value PQzhC1QBMBHY wBUZB4iWV0jt