确定所用散列算法的步骤

逆向工程 加密 密码学 密码分析
2021-07-10 15:35:19

我有 5 个测试用户,他们有相同的密码。我正在测试以加密格式将密码存储在数据库中的应用程序。我想了解该程序使用了哪种哈希算法?所以我的问题是你有什么建议来解决这个问题?

是否有任何可以遵循的标准步骤?

用户密码: test123

不同用户相同密码的加密格式:

h9ttr35YmriZmKpo/9sasilzawjUbKYZ

M321NBD2wWLfltj46O/EuVmadsaHn8o0

213/zAYdB+Bi14ZayHPygNpklhjDijka

2个回答

在这种情况下,我的意思是攻击者所做的正常过程是对应用程序代码(即反汇编和类似工具)进行逆向工程,以找到实际代码。这将给出明确的答案。

如果您不对代码进行逆向工程,那么您将只能靠猜测,这会很乏味,因为不知道您是否“接近”解决方案。与好莱坞电影中经常出现的情况相反,当密钥或算法不正确时,您不会得到略微模糊的图像。现实世界的密码学是一个全有或全无的世界;你要么一直拥有正确的系统,直到最后一点,要么你得到看似随机的噪音。(除非算法非常糟糕,不幸的是,当人们觉得他们可以像做网页一样进行加密时,这种情况经常发生,通过匆忙地将博客网站上的例子拼凑在一起。)

至于猜测,我们可以说如下:

  • 输出看起来像Base64Base64 是一种编码格式,它将每三个输入字节转换为四个可打印的字符;这些字符是字母(大写和小写)、数字、“+”和“/”(并且可能在末尾有一些“=”符号用于填充)。Base64 中的 32 个字符因此编码了 24 个字节。我们正在寻找一个产生 24 个字节的进程。

  • 不同用户的相同密码会产生不同的输出。因此,散列过程将使用“用户标识符”(姓名、电子邮件地址、UUID、数据库表主键...)和/或一些随机值。要检查随机性,请尝试为给定用户重置密码,选择相同的密码。如果对于同一用户,即使您将密码重置为相同的值,您也会得到不同的输出,则该过程是随机的,并且某处必须有一些随机盐

  • 如果过程不是随机的,那么我们正在寻找一个产生 192 位输出的哈希函数。数量不多;最常用的是Tiger(但它仍然很少见)。Bcrypt也产生 192 位,但 bcrypt 本质上是随机的(您需要对现有实现进行大量折磨以去除随机盐)。

  • 如果过程是随机的,那么就有一个随机盐,它可能是输出的一部分。然后,我们可能正在寻找具有 128 位输出(想到 MD5)和 64 位盐的哈希函数,或者具有 160 位输出(SHA-1,或者 RIPEMD- 160) 以及 32 位盐。盐可能包含在输出的第一个或最后一个字节中。

  • 然后是关于如何使用哈希的未知部分。使用散列函数组合盐和密码时,可以观察到多种方法。有一些很好的方法可以使用盐和散列函数(例如PBKDF2或最近的Unix crypt()变体)进行密码散列然后有很多不好的方法,一两个带有创造性嵌套的哈希调用。在这一点上,这主要是运气问题:您必须尝试与应用程序开发人员使用的完全相同的方式。

生成的密码是 32 个字符,因此您可能正在查看 MD5 哈希。如果是 SHA256,则长度为 64 个字符。

由于每种情况下生成的密码不同,因此应用程序可能会使用带有散列的盐来提高安全性并消除使用彩虹表进行散列比较的威胁。

访问应用程序源代码或数据库存储过程会很有用!