24

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

编辑:
我的问题是:性能有什么区别?而不是关于安全性,因为我已经知道 SHA-2 比 SHA-1 更安全。
在此链接中,对不同类型的 SHA-2 进行了比较,指出何时使用 SHA-512,何时不使用。我需要关于 SHA-1 和 SHA-2 的类似论点。

4

4 回答 4

65

使用 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 。

于 2011-02-15T12:08:08.230 回答
3

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

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

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

但是,两者都没有那么慢:从长远来看,您可以期望在现代计算机上用 SHA-2(256 位)在几毫秒内散列一个 100KB 文件(或在几十毫秒内处理一个 1MB 文件) .

于 2011-02-15T09:42:44.233 回答
1

实际上没有,这取决于所需的安全级别和/或偏执狂。我会在任何新应用程序中使用 SHA256,但这需要足够大的 RSA 密钥来处理整个 SHA256 指纹作为有效负载。

于 2011-02-15T09:41:38.920 回答
-1

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

于 2011-02-15T09:40:39.727 回答