SHA-1创建哈希需要多长时间?

How long does SHA-1 take to create hashes?

本文关键字:长时间 创建 哈希需 SHA-1      更新时间:2023-10-16

创建数据的SHA-1哈希大约需要多长时间,需要多少处理能力?这取决于原始数据的大小吗?生成标准HTML文件的哈希值会比字符串"blah"花费的时间长得多吗?c++、Java和PHP的速度如何比较?

你问了很多问题,希望我能依次回答。

SHA-1(以及许多其他设计为密码学强的哈希)是基于对固定大小的数据块重复应用加密或解密例程。因此,当计算一个长字符串的哈希值时,算法比计算一个小字符串的哈希值花费更多的时间。从数学上讲,当使用SHA-1时,我们说散列长度为N的字符串的运行时间为O(N)。因此,对HTML文档进行散列处理所花费的时间应该比对字符串"blah"进行散列处理所花费的时间长,但只是按比例进行。执行哈希不会花费太多时间。

至于比较c++、Java和PHP的速度,这是一个危险的领域,我的答案可能会被抨击,但一般来说, c++比Java快一点,Java比PHP快一点。用其中一种语言编写的良好哈希实现,如果编写得不好,可能会显著优于其他语言。然而,你不需要为此担心。实现自己的散列函数、加密例程或解密例程通常被认为是一个坏主意,因为它们经常容易受到侧通道攻击,攻击者可以利用实现中的漏洞破坏您的安全性,而这些漏洞通常很难预料到。如果你想使用一个好的哈希函数,请使用预先编写的版本。它可能比手工操作更快、更安全、更少出错。

最后,我建议不要使用SHA-1。SHA-1具有已知的加密弱点,您应该考虑使用强散列算法,例如SHA-256。

希望这对你有帮助!

加密散列函数的"速度"通常以"每字节时钟周期"来衡量。请参阅本页的一个公认过时的比较——您可以看到实现和架构如何影响结果。结果的差异很大程度上不仅取决于所使用的算法,还取决于您的处理器架构、实现的质量以及实现是否有效地使用了硬件。这就是为什么有些公司专门开发硬件,特别适合于尽可能高效地执行某些加密算法的确切目的。

一个很好的例子是SHA-512,尽管它在比SHA-256更大的数据块上工作,人们可能倾向于认为它通常应该比SHA-256在更小的输入上执行得慢-但是SHA-512特别适合64位处理器,有时甚至比SHA-256更好。

所有现代哈希算法都在固定大小的数据块上工作。它们在一个块上执行固定数量的确定性操作,并对每个块执行此操作,直到最终得到结果。这也意味着输入的时间越长,操作花费的时间就越长。根据刚才解释的特征,我们可以推断出操作的长度与消息的输入大小成正比。从数学上或计算机科学上讲,我们将此称为O(n)操作,其中n是消息的输入大小,正如templatetypedef已经指出的那样。

你不应该让哈希的速度影响你对编程语言的选择,所有现代哈希算法都非常非常快,不管是哪种语言。尽管基于c的实现会比Java稍微好一点,Java也可能比PHP快一点,但我敢打赌,在实践中您不会知道其中的区别。

SHA-1以64字节为块处理数据。散列长度为n字节的文件所需的CPU时间大致等于n/64乘以处理一个块所需的CPU时间。对于短字符串,您必须首先将字符串转换为字节序列(SHA-1适用于字节,而不是字符);字符串"blah"将变成4或8字节(如果分别使用UTF-8或UTF-16),因此它将被散列为单个块。注意,从字符到字节的转换可能比散列本身花费更多的时间。

使用sphlib的纯Java SHA-1实现,在我的PC (x86 Core2, 2.4 GHz, 64位模式)上,我可以在132 MB/s的带宽下散列长消息(这是使用单个CPU核心)。注意,这超过了普通硬盘的速度,所以当散列一个大文件时,很可能是磁盘成为瓶颈,而不是CPU:散列文件所需的时间将是从磁盘读取文件所需的时间。

(同样,使用C语言编写的本地代码,SHA-1速度可达330mb/s)

SHA-256被认为比SHA-1更安全,在我的PC上,SHA-256的纯Java实现的速度为85 MB/s,这仍然相当快。从2011年开始,SHA-1不被推荐使用。