39

我并不是说这是一场辩论,但我试图理解为什么这么多应用程序使用 SHA1 来散列秘密背后的技术原理,而 SHA512 更安全。也许这只是为了向后兼容。

除了明显更大的大小(128 个字符对 40 个字符)或轻微的速度差异之外,人们使用前者还有其他原因吗?

此外,我相信 SHA-1 是几年前首次被 VCR 的处理器破解的。有没有人破解过 512(也许用吹叶机),或者它在不加盐的情况下仍然可以安全使用吗?

4

3 回答 3

46

SHA-1 的大多数用途是为了实现互操作性:当我们实施强制使用 SHA-1 的协议时,我们会使用 SHA-1。还考虑了易于开发:各种语言和编程环境中的 SHA-1 实现比 SHA-512 实现更常见。

此外,即使散列函数的大多数用法没有性能问题(至少在散列函数是瓶颈的情况下没有性能问题),但在某些架构中,SHA-1 比 SHA-512 效率高得多。考虑一个基本的 Linksys 路由器:它使用 Mips 衍生 CPU,时钟频率为 200 MHz。这样的机器可以重新编程,例如使用OpenWRT(用于嵌入式系统的小型 Linux)。作为路由器,它具有快速的网络(100Mbit/s)。假设您想要散列一些数据(例如,作为某些 VPN 软件的一部分——路由器看起来很适合运行 VPN)。使用 SHA-1,您将获得大约 6 MB/s,使用完整的 CPU。这已经远远低于网络带宽。SHA-512 在同一台机器上不会超过 1.5 MB/s。在这样的系统上,性能上的差异是不可忽略的。此外,如果我在我的 Linksys 路由器上使用 SHA-1 进行某些通信协议,那么链接另一端的机器也必须使用 SHA-1。

好消息是,选择一个新的标准散列函数(代号为SHA-3 )的竞争正在进行中。一些竞争候选者提供类似于 SHA-1 的性能,甚至更好一些,同时仍然产生 512 位输出并且(可能)与 SHA-512 一样安全。

于 2010-04-15T19:47:30.467 回答
26

SHA1 和 SHA512 都是哈希函数。如果您将它们用作加密哈希,那么也许这是使用 SHA512 的好理由;但是,有些应用程序仅使用这些功能来识别对象。例如,Git 使用 SHA1 廉价地区分对象。在这种情况下,由于使用 SHA1 两个文档之间发生冲突的可能性非常小,因此当 SHA1 非常适合该任务时,SHA512 的额外空间要求确实没有理由。

关于加密哈希和是否使用盐的选择,您可能有兴趣阅读Don't Hash Secrets。即使使用 SHA512,使用盐也是一个好主意(而且这样做也很便宜,所以为什么不这样做呢?),因为您可以猜出最高密码并查看它们是否具有相同的哈希值,但作者指出HMAC是一种更安全的机制。在任何情况下,您都必须确定与额外时间+空间相关的成本以及与违规可能性相关的成本,并确定您想要的偏执程度。正如微软最近发现的那样,不断更改密码是浪费金钱,而且没有回报,所以虽然偏执在安全方面通常是好的,但你真的必须做数学来确定它是否有意义......在安全方面的收益是否超过了时间和存储成本?

于 2010-04-14T20:00:29.883 回答
3

如果您需要快速散列某些内容,或者只需要 160 位散列,则可以使用 SHA-1。

为了快速将数据库条目相互比较,您可能会获取 100 个字段并从中生成 SHA-1 哈希,产生 160 位。那 160 位是 10^50ish 的值。

如果我不太可能拥有超过 10^50th 值的一小部分,那么使用更简单、更快的算法对我拥有的内容进行哈希处理会更快。

于 2010-04-14T20:13:14.413 回答