我有使用 MySQL 的 Web 应用程序
应用程序使用MySQL的密码哈希函数来存储相关帐户的密码
问题是,它修剪了散列密码,使其仅将前 10 个字符存储到密码字段中
我想向我的主管证明,修剪散列密码可以使不同的密码在登录表单上输入并被应用程序接受。因为这些密码具有相同的前 10 个字符
为了证明这一点,我打算使用hashcat。我已经下载了相当大的字典文件来帮助我的目的
那么,有人可以帮助我如何在hashcat中使用参数吗?
我试图用谷歌搜索答案,但没有运气
谢谢
有关实际问题的答案,请跳到此答案的最后一部分。其他部分不直接回答您的问题,但您可能会在阅读后发现不再需要这样做。
您对系统的描述
您说系统按如下
方式处理密码plaintext password
➜hashed password
➜first 10 characters of the hash
示例:
Topsecret123
➜*E7C95D33E14D3C2A3AE4EAB25C1D98C88593F7AC
➜*E7C95D33E
请注意,MySQL 的PASSWORD()
以*
为哈希作为前缀,因此您实际上只包含哈希中的 9 个字符。
在后台回答问题
您询问如何使用hashcat从上面找到该方法的哈希冲突,但您实际上想知道/显示的是
证明修剪散列密码可以使应用程序接受不同的密码[...]
您的重点是">修剪导致接受多个密码"。但是,您忽略了即使是未修剪的哈希也会导致接受多个密码。
鸽子洞原理
解释非常简单,您不必找到哈希冲突。每个人都应该了解以下内容:
- 有无限数量的密码。
- MySQL密码哈希具有固定长度,正好是64位。只能有 264个不同的哈希。 密码哈希
- 函数将密码映射到哈希。由于密码多于哈希,因此某些密码必须映射到同一哈希。
如果没有,您会发现一个压缩功能,该功能允许您仅以 64 位存储任何内容。
有人可能会争辩说,有效密码的数量不是无限的。但是,即使您将有效密码限制为正好长度为 11 并且仅包含组[A-Za-z0-9]
中的符号(有 62 个符号),也会有 62 个11 个唯一密码:
6211≈ 5,2×10 19密码
264≈ 1,8×10 19哈希
因此,仍然必须有很多碰撞。
哈希冲突
修剪哈希不是冲突问题的根本原因,但当然它会极大地增加冲突的可能性。通常,哈希冲突不是问题,因为它们很少发生,以至于您不会遇到它们。但是,对于像您这样经过强烈修剪的哈希,冲突成为一个真正的问题。
寻找碰撞
使用哈希猫
hashcat可以使用-m 300
计算MySQL密码哈希。您可以通过计算SELECT Password("hashcat");
并将生成的哈希值与此处显示的哈希值进行比较来确认这一点。
但是,我找不到修剪这些哈希/查找前缀冲突的方法。我想哈希猫不能做你想做的事。您必须为 hashcat 实现自定义哈希模式。最简单的方法是改变hashcat的MySQL模式的当前实现。我不确定,但也许只需将const int out_len = 40;
更改为9
就足够了.您可能还需要更新同一模块的 OpenCL 版本。在此处搜索m00300
。
使用自定义脚本
或者,查找密码哈希对列表或自己生成一个,然后在该表中查找前缀冲突。这很有趣,所以我自己做了
以下 python 程序为一些数字密码生成修剪后的哈希:
#! /usr/bin/python3
import hashlib as hl
def mySqlPwHash(password):
return hl.sha1(hl.sha1(password.encode()).digest()).hexdigest()[:9]
for number in range(0, 300000):
password = str(number)
print(password, "t", mySqlPwHash(password))
我选择生成 300'000 个哈希,因为有 16个 9修剪的哈希,我们可以期望在 √(169) = 262'144 次尝试中找到冲突(请参阅生日问题)。
要查找具有相同哈希的密码,请按如下方式运行脚本:
./collide.py | sort -k2 | uniq -Df1
在短短两秒钟内,脚本完成并打印
23607 47ae310ff
251848 47ae310ff
你有它,两个密码(23607
和251848
)具有相同的修剪哈希(47ae310ff
)。
如果修剪后的哈希实际上包含 10 个十六进制数字,您可以调整脚本,并在共享哈希47fc464b2f
中找到两个密码1874547
和2873667
。