创建SHA-1数据哈希需要多长时间,以及需要多少处理能力?根据原始数据大小,这有很大不同吗?生成标准HTML文件的哈希值会比字符串“blah”长得多吗? C ++,Java和PHP如何在速度上进行比较?
答案 0 :(得分:11)
你问了很多问题,所以希望我可以尝试依次回答每一个问题。
SHA-1(以及设计为加密强大的许多其他哈希)基于对加固或解密例程重复应用于固定大小的数据块。因此,当计算长字符串的散列值时,算法比计算小字符串的散列值成比例地花费更多时间。在数学上,我们说使用SHA-1时,对长度为N的字符串进行散列的运行时为O(N)。因此,散列HTML文档应该比散列字符串“blah”花费更长的时间,但只是按比例这样。哈希不会花费更长的时间。
至于在速度方面比较C ++,Java和PHP,这是一个危险的领域,我的答案可能会受到轰炸,但一般来说 C ++比Java略快一点比PHP更快。如果编写得不好,那么使用其中一种语言编写的优秀哈希实现可能会明显优于其他语言。但是,您不必担心这一点。实现自己的哈希函数,加密例程或解密例程通常被认为是一个坏主意,因为它们通常容易受到side-channel attacks的攻击,攻击者可能通过使用通常非常困难的实现中的错误来破坏您的安全性已经预料到了。如果要使用良好的哈希函数,请使用预先编写的版本。它比你手工做的更快,更安全,更容易出错。
最后,我建议不要使用SHA-1。 SHA-1已知存在加密弱点,您应该考虑使用强哈希算法,例如SHA-256。
希望这有帮助!
答案 1 :(得分:5)
加密散列函数的“速度”通常以“每个字节clock cycles”来衡量。请参阅此page以了解一个公认的过时比较 - 您可以看到实施和架构如何影响结果。结果差别很大,不仅因为使用了算法,而且它们在很大程度上还取决于您的处理器架构,实现的质量以及实现是否有效地使用硬件。这就是为什么有些公司专注于创建特别适合尽可能高效地执行某些加密算法的确切目的的硬件。
一个很好的例子是SHA-512,虽然它适用于比SHA-256更大的数据块,但是人们可能倾向于认为它通常比在较小的输入上工作的SHA-256要慢 - 但SHA-512特别好适用于64位处理器,有时甚至比SHA-256更好。
所有现代哈希算法都在处理固定大小的数据块。它们对块执行固定数量的确定性操作,并对每个块执行此操作,直到最终得到结果。这也意味着输入时间越长,操作所需的时间越长。从刚才解释的特征中我们可以推断出操作的长度与消息的输入大小成正比。从计算机科学的角度来看,我们将其称为O(n)操作,其中n是消息的输入大小,如templatetypedef已经指出的那样。
你不应该让哈希的速度影响你选择的编程语言,所有现代哈希算法都非常非常快,无论语言如何。虽然基于C的实现会比Java稍微好一些,后者可能会比PHP快一点,但我在实践中打赌你不会知道它们的区别。
答案 2 :(得分:3)
SHA-1按64字节的块处理数据。散列长度 n 字节的文件所需的CPU时间因此大致等于处理一个块所需的CPU时间的 n / 64 倍。对于短字符串,必须先将字符串转换为字节序列(SHA-1适用于字节,而不是字符);字符串"blah"
将变为4或8个字节(如果您分别使用UTF-8或UTF-16),因此它将作为单个块进行哈希处理。请注意,从字符到字节的转换可能比散列本身花费更多的时间。
在我的PC(x86 Core2,2.4 GHz,64位模式)上使用来自sphlib的纯Java SHA-1实现,我可以以132 MB / s的带宽散列长消息(这是使用的一个CPU核心)。请注意,这超出了普通硬盘的速度,因此在对大文件进行散列时,可能是磁盘将成为瓶颈,而不是CPU:散列文件所需的时间将是读取所需的时间来自磁盘的文件。
(另外,使用用C编写的本机代码,SHA-1速度最高可达330 MB / s。)
SHA-256被认为比SHA-1更加安全,并且我的PC上的纯Java实现SHA-256的速度为85 MB / s,这仍然非常快。截至2011年,不建议使用SHA-1。