如果我知道给定输入的匹配哈希,我能否确定使用了哪种算法?

信息安全 哈希
2021-08-20 17:13:23

如果我知道编码为“Tut0nlFFZ9sLVhPE5x81lQ==”的原始文本“12345”,我如何识别散列算法?

4个回答

根据观察,这看起来像 base64 编码(注意这不是哈希,它是编码字符串)。我可以告诉这一点,因为我知道在 base64 中,可以=根据需要填充字符串的末尾,以使 base64 字符串具有可预测的长度。其他迹象可以来自字符串中某些字符的使用。这些您将通过简单地接触现有示例并阅读那里的各种编码算法来学习。

base64 编码的字符串12345实际上是MTIzNDU=,而不是您提供的。解码您提供的字符串会产生:NëtžQEgÛVÄç5•. 这里的高熵表明这可能是某种加密算法的结果。由于一个好的加密算法的要点是无法从随机数据中确定它,因此发现使用哪种算法通常并不容易,您通常不得不求助于蛮力。

假设这是某种练习,您确定您的输入可以解决这个问题,并且您被要求确定用于加密它的密码,您可以使用在尝试密码后检查输出的方法进行暴力破解确实是12345这样,您实际上可以验证您猜对了密码。祝你好运!

“加密值”是Base64:这是将任意字节编码为可打印字符的编码。在 Base64 中,每三个输入字节变成四个字符;可能的字符是字母(大写和小写)、数字、“+”和“/”。此外,可能有一个或两个最终的“=”符号,因此总长度是 4 的倍数。这些“=”符号是 Base64 的死板。

在您的情况下,“加密值”是 16 个字节序列的 Base64 编码。这 16 个字节(十六进制)将是4eeb749e514567db0b5613c4e71f3595. 在散列函数的上下文中,16 个字节通常表示 MD4 或 MD5。但是有许多可能的变体。例如,如果该“加密值”出现在“用户数据库”(例如散列密码)中,那么输入很可能以某种方式与某些其他用户特定字段“加盐”。要检查这一点,请尝试为两个不同的用户提供相同的密码;如果他们得到不同的哈希值,则应用加盐(可能使用用户名或其他字段)。

这些值不会单独出现;它们在上下文中:您在与某些应用程序或服务器软件链接的文件或数据库中找到它。有关散列函数加密类型的线索将在该上下文中找到。

您同时对同一事物使用散列、编码和加密,而它们是完全不同的事物。简单的说:

  • 散列 => 一种方式不可逆
  • 加密 => 可逆但受到安全保护
  • 受保护的编码 => 没有保护的可逆

找出答案的最佳方法是采用所有不同的算法并对纯文本进行散列/编码,然后查看哪些输出匹配。我有一种强烈的感觉,编码是BASE64。现在他们所做的可能是:BASE64(hash(x)),所以最好的办法是解码 BASE64,采用二进制表示并将其与纯文本字符串的不同哈希结果进行比较。

首先,让我指出这Tut0nlFFZ9sLVhPE5x81lQ==是字符串“NtQEg?V?5”的base64编码,而不是散列函数产生的值。
其次,由于您的问题表明加密散列之间的区别尚不清楚,我建议您在进一步探讨此事()之前先看看这两个 SO 问题

回到问题,为了检测使用了哪个散列函数,您可以查看散列值,因为散列算法通常具有固定长度的输出。例如,MD5 产生一个 128 位的值(32 个十六进制字符),而 SHA1 产生一个 160 位的值(40 个十六进制字符)。让我们看看它的实际效果:

  • “12345”的MD5哈希是827ccb0eea8a706c4c34a16891f84e7b,SHA1哈希是8cb2237d0679ca88db6464eac60da96345513964
  • "1234567890" 的 MD5 哈希是e807f1fcf82d132f9bb018ca6738a19fSHA1 哈希是01b307acba4f54f55aafc33bb06bbbf6ca803e9a.

如您所见,散列与在较短字符串上计算的散列具有相同的长度。

即使您可以访问明文及其散列值,找到使用的算法也可能不像看起来那么简单。

如果实现使用单一的散列算法(这是常见的做法),检测正确的算法是微不足道的,并且可以使用免费提供的应用程序(例如MD5Decrypter)来完成。请记住,某些应用程序可能会以不同的方式实现它:

  • 在保存哈希之前对它们进行编码(例如base64(md5($text))) - 可以使用许多免费提供的工具之一来解码常见方案
    • 例如,以 Base64 编码的“12345”的 MD5 哈希是 gnzLDuqKcGxMNKFokfhOew==
  • 多个散列算法(例如sha1(md5($text))) - 一次找出一个,直到检测到最后一个
  • 用于增强哈希以抵御攻击 - 仍然可以检测使用的哈希算法,但简单地对明文进行哈希不会返回相同的值
  • 虽然与最佳实践相反,应用程序可以运行用于存储信息的自定义算法 - 确定如何操作明文字符串的难度完全取决于自定义实现

通过了解底层技术也可以找出正在使用的算法:Windows 密码可以是 LM 或 NTLM 哈希,在 MySQL 数据库中找到的凭据可能(不常见)使用 MySQL 的 PASSWORD() 函数进行哈希,等等。