我何时应该使用SHA-1,何时应该使用SHA-2?

时间:2011-02-15 09:34:13

标签: c# security rsa digital-signature sha

在我的c#应用程序中,我正在使用RSA签名文件,然后由上传人员上传到我公司的数据库中,在这里我必须选择SHA-1或SHA-2来计算哈希值。登记/> 与编程中的任何其他组件一样,我知道必须有一个“在这里使用”和“在那里使用它”。两个。 那么,什么时候?那时呢?

编辑:
我的问题是:性能有什么不同?而不是安全问题,因为我已经知道SHA-2比SHA-1更安全 在此Link中,在不同类型的SHA-2之间进行比较,注意何时使用SHA-512以及何时不使用SHA-512。我需要一个关于SHA-1和SHA-2的类似论点。

4 个答案:

答案 0 :(得分:64)

使用SHA-2。总是。由于遗留代码的互操作性问题,SHA-1应保留用于无法使用SHA-2的情况。

在执行实际措施之前,没有性能问题。散列函数很快。在大多数情况下,哈希函数性能只有微不足道的影响;甚至检测它可能会很困难。安全第一。由于在SHA-1中发现了弱点,因此使用它仍然需要一些强有力的理由。使用SHA-256不会受到质疑;这是“默认选择”。但如果您使用SHA-1,请准备受到批评。

请注意,四个函数称为“SHA-2”:SHA-224,SHA-256,SHA-384和SHA-512。 SHA-224和SHA-256是相同的功能,除了内部参数(“初始值”)和输出大小(SHA-224输出大小为28字节,而SHA-256提供32字节);它们具有相同的性能特征。同样,SHA-384和SHA-512在性能方面也是相同的功能。 SHA-512使用64位算术运算,并且在提供64位操作码的平台上比SHA-256更快;在32位平台上,SHA-256会更快(注意:在具有本机代码的32位x86上,可以使用SSE2操作码及其64位计算能力,因此一些原生在32位模式下,SHA-512的代码实现将比SHA-256更快; OpenSSL代码可以做到这一点;但据我所知,.NET中的SHA-512实现是“托管代码”)。此外,所有SHA- *函数都具有一些基本粒度,因为它们按块处理数据:对于SHA-256,块长度为64字节,而SHA-512使用128字节块;当散列非常短的数据元素时,较高的SHA-512粒度相应地降低了其性能。最后,SHA-256(在32位平台上)可能会产生更小的代码(即在CPU上使用更少的L1缓存)。

因此,如有疑问,请使用SHA-256。如果您打算使用SHA-1,那么您应该怀疑。

如果你想将哈希函数用于非加密用法(即弱点对你来说不是问题),那么考虑MD4而不是SHA-1。

答案 1 :(得分:3)

SHA-2更强大,更适合安全敏感的应用程序,如数字签名。

当您需要更短的哈希并且安全性不是问题时(例如,文件校验和),SHA-1很好。

编辑:SHA-1算法更快(比使用256位的SHA-2快10倍,比使用512位的SHA-2快20倍 - 至少在.NET实现中)。

然而,两者都不是那么慢:从透视角度来看,你可以期望在现代计算机(或几十分之一的1MB文件)上用几毫秒哈希一个带有SHA-2(256位)的100KB文件毫秒)。

答案 2 :(得分:1)

实际上并非如此,这取决于所需的安全和/或偏执程度。我将SHA256用于任何新应用程序,但是这需要足够大的RSA密钥,可以将整个SHA256指纹作为有效负载处理。

答案 3 :(得分:-1)

SHA2是更新更强的哈希算法。主要问题是接收者是否能够处理SHA2。如果收件人可以处理它, - 毫无疑问地使用SHA2。