如何评估哈希算法的强度?

信息安全 密码 哈希
2021-08-19 20:10:17

在工作中,我们用于密码的散列算法似乎是定制的。显然这是一个非常糟糕的主意,但管理层似乎并不在意。

该算法总是产生 20 个字符长的大写字符串。其行为的一个特别令人担忧的方面是相似的密码会产生相似的散列:Password1并且Password2产生的散列仅相差大约 5 个字符。

另一个明显的问题是,它看起来并不像算法故意变慢,我被告知好的散列算法 ( bcrypt, scrypt) 应该是这样。

如何评估散列算法的强度?对于一致性差的快速哈希算法,我们应该特别关注哪些类型的攻击?

我可以访问源代码(尽管很遗憾,出于显而易见的原因,我无法将其发布在公共论坛上)。

4个回答

强大的散列算法意味着即使更改一个字符也会导致完全不同的散列。

一个好的散列算法具有以下特点:

  • 哈希值由被哈希的数据决定
  • 哈希函数使用所有给定的数据
  • 哈希将所有可能的哈希均匀分布在所有可能的哈希结果中
  • 如果你有一个字符串并且你取一个非常相似的字符串,你会得到一个完全不同的哈希结果(改变一个输入的比特应该会以 50% 的概率改变所有的输出比特。另一个要求是哈希是可能的最大程度,在统计上独立于输入,例如输入中的高汉明权重不会在输出中产生异常的明权重。-多项式

请告诉您的管理层

在此处输入图像描述

不要成为 Dave,而只是使用标准哈希算法之一。如果您使用哈希来存储密码,请使用bcrypt. 在对密码进行哈希处理时,您还关心盐,bcrypt 会为您完成所有这些。此外,这一切都是免费的。

注意到:

相似的密码产生相似的散列:Password1 和 Password2 产生的散列仅相差大约 5 个字符

足以声明这种“散列”算法是纯粹的垃圾。至少,声称是“散列”的算法至少看起来是随机的。即使是像MD4这样彻底破坏的算法,甚至是非加密哈希(如CRC32)也提供了一个关于简单统计分析“令人满意”的输出。

您提到的哈希函数似乎遵循好莱坞的“近距离解密”幻想(当您几乎拥有正确的密钥时,文本几乎可读,只是有点模糊)。这只是Mastermind棋盘游戏的复兴。

安全是关于击败一个专注、聪明和恶意的对手。黑猩猩可能会破坏您工作中的哈希函数。

专业的评估非常复杂,需要由该领域的专家长期完成。话虽这么说,我认为您不需要专家来看看这个:使用均匀性差且尺寸小的快速哈希算法(20 个大写字符大约为 94 位,即使 md5 有 128 位),您很容易受到蛮力攻击哈希碰撞攻击。

贵公司应尽快更改此系统。

(实际上,根据该算法的实际糟糕程度,可能会反转它,以便快速程序可以立即为某些哈希提供正确的密码。这特别可怕,因为它会立即破坏所有密码。)

一个好的散列函数必须具有所谓的好的“雪崩特性”;消息的微小变化会在哈希摘要中产生很大的(理论上不可预测的)变化。您的哈希函数几乎没有雪崩效应。

雪崩效应是哈希函数抵抗“原像攻击”的主要方式之一。原像攻击本质上是“去散列”摘要;给定散列摘要和散列函数,找到将产生目标散列的消息(通常任何都可以;有时存在消息长度和字节值限制)。散列函数的基本目的是它的确定性但单向转换,因此任何可以在少于 2^N 时间内找到原像的算法,对于 N 位的散列摘要,都应该被视为散列是从根本上破坏。

恰当的例子;低雪崩效应意味着在给定消息已知更改的情况下,可以跟踪和预测哈希摘要的更改。这允许采用“寻求目标”的方法;给定一个起始消息,做一个小的改变,计算散列,看看它是否“更接近”真实的(更多的正确位集)。然后可以使用手术改变将工作信息塑造成原像。