Linux 使用hashcat,其中hash的前10个字符是已知的

Linux 使用hashcat,其中hash的前10个字符是已知的,linux,bash,shell,hashcat,Linux,Bash,Shell,Hashcat,我有一个使用MySQL的web应用程序 应用程序使用MySQL中的密码哈希函数来存储相关帐户的密码 问题是,它会修剪散列密码,以便只将前10个字符存储到密码字段中 我想向我的主管证明,修改散列密码可以在登录表单上输入不同的密码,并被应用程序接受。因为这些密码的前10个字符相同 为了证明这一点,我计划使用hashcat。我已经下载了相当大的字典文件来帮助我达到目的 那么,有没有人可以帮助我在hashcat中应该使用的参数是什么 我试着用谷歌搜索答案,但没有成功 感谢您回答实际问题,请跳到本答案的最

我有一个使用MySQL的web应用程序

应用程序使用MySQL中的密码哈希函数来存储相关帐户的密码

问题是,它会修剪散列密码,以便只将前10个字符存储到密码字段中

我想向我的主管证明,修改散列密码可以在登录表单上输入不同的密码,并被应用程序接受。因为这些密码的前10个字符相同

为了证明这一点,我计划使用hashcat。我已经下载了相当大的字典文件来帮助我达到目的

那么,有没有人可以帮助我在hashcat中应该使用的参数是什么

我试着用谷歌搜索答案,但没有成功


感谢您回答实际问题,请跳到本答案的最后一部分。其他部分不会直接回答您的问题,但您可能会发现,阅读这些部分后,这不再是必要的


您对系统的描述 您说过系统会按如下方式处理密码
明文密码
➜ <代码>哈希密码➜ <代码>哈希的前10个字符

示例:
Topsecret123
➜ <代码>*E7C95D33E14D3C2A3AE425C1D98C88593F7AC➜ <代码>*E7C95D33E

请注意,实际上您只包含散列中的9个字符


在后台回答问题 您曾问过如何使用hashcat从上面找到该方法的哈希冲突,但实际上您想知道/显示的是

证明哈希密码可以使应用程序接受不同的密码[…]

您的重点是»修剪导致接受多个密码«。但是,您忽略了即使是未修剪的哈希也会导致接受多个密码

鸽子洞原理 解释非常简单,您不必找到散列冲突。每个人都应该理解以下几点:

  • 密码的数量是无限的
  • MySQL密码哈希具有固定长度,精确到64位。只能有264个不同的哈希
  • 密码散列函数将密码映射到散列。由于密码多于散列,一些密码必须映射到同一散列。
    如果没有,您会发现一个压缩函数,它允许您仅以64位存储任何内容
有人可能会说,有效密码的数量不是无限的。但是,即使您将有效密码的长度限制为11,并且仅包含组
[A-Za-z0-9]
(有62个符号)中的符号,也会有6211个唯一密码:

#! /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))
6211≈ 5,2×1019个密码
264≈ 1,8×1019散列

因此,还必须有很多碰撞

散列冲突 修剪散列不是冲突问题的根本原因,但它当然会极大地增加冲突的可能性。通常,哈希冲突不是问题,因为它们很少发生,所以您不会遇到它们。然而,对于像您这样的强修剪散列,冲突成为一个真正的问题


发现碰撞 使用Hashcat hashcat可以使用
-m300
计算MySQL密码哈希。您可以通过将结果散列与显示的散列进行比较来确认这一点

但是,我找不到一种方法来修剪这些散列/查找前缀冲突。我猜hashcat不能做你想做的事。您必须为hashcat实现一个自定义hashmode。实现这一点的最简单方法是更改。我不确定,但只要换成
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))
我选择生成300000个散列,因为有169个经过修剪的散列,我们可以期望在中找到冲突√(169)=262'144次尝试(参见)

要查找具有相同哈希的密码,请按如下方式运行脚本:

./collide.py | sort -k2 | uniq -Df1
只用了两秒钟,脚本就完成并打印出来了

23607    47ae310ff
251848   47ae310ff
这里有两个密码(
23607
251848
)具有相同的修剪散列(
47ae310ff


如果修剪后的散列实际上包含10个十六进制数字,您可以调整脚本,并找到共享散列的两个密码
1874547
2873667
47fc464b2f

,以获得实际问题的答案,请跳到此答案的最后一节。其他部分不会直接回答您的问题,但您可能会发现,阅读这些部分后,这不再是必要的


您对系统的描述 您说过系统会按如下方式处理密码
明文密码
➜ <代码>哈希密码➜ <代码>哈希的前10个字符

示例:
Topsecret123
➜ <代码>*E7C95D33E14D3C2A3AE425C1D98C88593F7AC➜ <代码>*E7C95D33E

请注意,实际上您只包含散列中的9个字符


在后台回答问题 您曾问过如何使用hashcat从上面找到该方法的哈希冲突,但实际上您想知道/显示的是

证明哈希密码可以使应用程序接受不同的密码[…]

您的重点是»修剪导致接受多个密码«。但是,您忽略了即使是未修剪的哈希也会导致接受多个密码

鸽子洞原理 解释是如此简单以至于