密码学4 选择哈希算法时需要考虑哪些因素?

351 阅读5分钟

选择哈希算法时需要考虑哪些因素?

有哪些可用的算法?

判断一个现存的算法,还能不能继续使用是我们选择算法的第一步。

可用性算法分类

  1. 退役的算法,就是那些已经退出了历史舞台的算法,它们的安全强度很弱,你一定不能再 用了。
  2. 遗留的算法,它们存在明显的安全问题,已经不足以支撑现在的安全强度需求了,不要用在新系统中了。
  3. 现行的算法,没有明显的安全问题,是我们现在可以使用的算法。

常见Hash算法

image.png

image.png image.png

CPB - 计算性能指标
在以上表格中我们可以看到有一列是计算性能,它表示在数据运算时,处理一个字节处理需要执行的微处理器的时钟周期数。它使用的度量单位是每字节周期数(CPB,Cycles Per Byte)。 每字节周期数是一个常用的密码算法实际性能的参考指标。每字节花费的时钟周期数越小,表示这个算法运算得越快,性能越好

为什么有的哈希算法有处理能力限制?

在上面的表格里,我们还能看到有一列是数据处理能力。数据处理能力指的是对应的单向散列函数能够处理的最大的输入数据。比如,SHA-256 能够处理的最大数据是 2^64 位。 我们前面说过,单向散列函数可以把任意大小的数据,转行成固定长度的数据。那为什么有的单向散列函数还有处理能力限制呢?上限不应该是无限大吗?为什么有的单向散列函数,比如SHAKE128,又没有处理能力限制呢?

单向散列函数的处理过程
一个典型的单向散列函数,由四个部分组成:

  1. 数据分组:
  2. 链接模式
  3. 单向压缩函数
  4. 终结函数

image.png

其中数据分组负责把输入数据分割成压缩函数能够处理的数据块, 按"位"计量。一般来说压缩函数能接受的数据块大小是一定的,但是我们的输入却不一定是固定的,所以整数倍的数据,可以送给压缩函数分批处理;不足整数倍的数据,就需要填充、补齐,变成压缩函数可以处理的数据块大小

补齐方案带来的限制
在下图 SHA-1 和 SHA-2 的数据补齐方案里,输入数据长度是补充数据的一部分。其中, SHA-1、SHA-224、SHA-256 使用 64 位来表示输入数据长度;SHA-384、SHA-512、 SHA-512/224 和 SHA-512/256 使用 128 位来表示输入数据长度。 但是,如果输入数据长度超过了数据补齐方案的限制,数据就没有办法分组了。这就是单向散列函数数据处理能力限制的来源

image.png

而SHA-3 的设计,放弃了在数据补齐方案里使用固定位数表示输入数据长度的做法,这也解释了她为什么没有数据处理能力的限制。

到目前为止,这个数据处理能力限制是很高的,一般的应用程序很难超越它。 但是当我们需要考虑数据处理能力限制的时候,我们千万不能疏忽了它。

选择什么样的数据补齐方案,是密码学里一个棘手的问题。很多针对密码算法的攻击,都 是从数据补齐方案下手的,比如后面我们会说到的长度延展攻击

算法的性能是怎么决定的?

从理论上讲,如果不考虑其他因素,一个算法的性能主要是由算法的复杂度决定的。

但实际上,在一个算法的实现细节中,通常影响计算性能的因素有:

  1. 算法实现的内存使用影响;
  2. 算法实现有没有使用优化的步骤,比如并行计算或者预运算?
  3. 算法实现有没有使用硬件加速,比如使用 CPU 关于算法的扩展指令?

比如:
并不是每一个算法都有 CPU 扩展指令,或者每一个实现都支持 CPU 扩展指令,这样它的性能一般会落后于 CPU 扩展指令数十倍。

另外计算机本身的指令集,比如是使用 32 位还是 64 位的指令,是否和算法匹配,也是 影响算法性能的一个重要因素。我们经常可以看到,SHA-512 的计算速度,比 SHA-256 还要快。SHA-256 使用 32 位的数据进行计算,而 SHA-512 使用 64 位的数据进行计算。现在的计算机,一般都是 64 位的。所以运行在 64 位的计算机上,基于 32 位的计算可能 反而比基于 64 位的计算还要慢。

如何选择合适的哈希算法?

综上所述,一个好的哈希算法应该考虑到安全性,性能,数据处理能力方面的因素。而针对一个应用程序,我们应该选用现行的、流行的算法。现行推荐的算法,保证了算法的安全性。流行的算法,成熟的实现会考虑实现优化,包括 CPU 扩展指令的支持。 选用流行的算法,也是获得较好计算性能的一个实践办法。

推荐使用的单向散列函数算法:
SHA-256
SHA-384
SHA-512