我有使用 MySQL 的 Web 应用程序
应用程序使用 MySQL 的密码哈希函数来存储相关帐户的密码
问题是,它会修剪散列密码,使其仅将前 10 个字符存储到密码字段中
我想向我的主管证明,修整散列密码可以使登录表单上输入不同的密码并被应用程序接受。因为这些密码的前 10 个字符相同
为了证明这一点,我打算使用 hashcat。我已经下载了相当大的字典文件来帮助我的目的
那么,是否有人可以帮助我在 hashcat 中应该使用的参数如何?
我试图用谷歌搜索答案,但没有运气
谢谢
有关实际问题的答案,请跳至此答案的最后一部分。其他部分没有直接回答您的问题,但您可能会在阅读后发现不再需要这样做。
你说系统处理密码如下
plaintext password
➜➜hashed password
first 10 characters of the hash
示例:
Topsecret123
➜ *E7C95D33E14D3C2A3AE4EAB25C1D98C88593F7AC
➜*E7C95D33E
请注意,MySQL 的PASSWORD()
前缀带有 a 散列*
,因此您实际上只包含散列中的 9 个字符。
您询问了如何使用 hashcat 从上面的方法中查找哈希冲突,但您真正想知道/显示的是
证明修剪散列密码可以使应用程序接受不同的密码[...]。
您的重点是 »修剪会导致接受多个密码«。但是,您忽略了即使未修剪的散列也会导致接受多个密码。
解释很简单,你不必找到哈希冲突。大家应该明白以下几点:
有人可能会争辩说,有效密码的数量不是无限的。但是,即使您将有效密码的长度限制为 11 并且仅包含组中的[A-Za-z0-9]
符号(有 62 个符号),也会有 62 11 个唯一密码:
62 11 ≈ 5,2×10 19 个 密码
2 64 ≈ 1,8×10 19 个哈希
因此,仍然必须有很多碰撞。
修剪散列不是冲突问题的根本原因,但它当然会极大地增加冲突的可能性。通常,哈希冲突不是问题,因为它们很少发生,以至于您不会遇到它们。但是,对于像您这样经过严格修剪的哈希,冲突成为一个真正的问题。
hashcat 可以使用-m 300
. 您可以通过计算SELECT Password("hashcat");
得到的哈希值并将其与此处显示的哈希值进行比较来确认这一点。
但是,我找不到修剪这些哈希/查找前缀冲突的方法。我猜hashcat 不能做你想做的事。您必须为 hashcat 实现自定义 hashmode。最简单的方法是改变hashcat 的 MySQL mode 的当前实现。我不确定,但也许只需更改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 个修剪过的哈希,我们可以期望在 √(16 9 ) = 262'144 次尝试中找到冲突(请参阅生日问题)。
要查找具有相同哈希的密码,请运行以下脚本:
./collide.py | sort -k2 | uniq -Df1
脚本仅用了两秒钟就完成并打印了
23607 47ae310ff
251848 47ae310ff
有了它,两个密码(23607
和251848
)具有相同的修剪哈希(47ae310ff
)。
如果您修剪的哈希实际上包含 10 个十六进制数字,您可以调整脚本并找到两个密码1874547
并2873667
共享哈希47fc464b2f
。