我有点搞不懂SHA-2和SHA-256之间的区别,经常听到它们可以互换使用。我认为SHA-2是哈希算法的“家族”,SHA-256是该家族中的一种特定算法。有谁能澄清这混乱。
发布于 2015-10-16 19:00:19
SHA-2族由多个密切相关的散列函数组成.它本质上是一个单一的算法,其中几个小参数在变体之间是不同的。
最初的规范仅涵盖224、256、384和512位变体。
这些变体之间最显著的区别是,有些是32位变体,有些是64位变体。就性能而言,这是唯一重要的区别。
在32位CPU上,SHA-224和SHA-256将比其他变体快得多,因为它们是SHA-2家族中唯一的32位变体。由于在32位CPU上执行64位操作所增加的复杂性,在32位CPU上执行64位变体将是缓慢的。
在64位CPU上,SHA-224和SHA-256将比其他变体慢一点。这是因为由于一次只处理32位,他们将不得不执行更多的操作,以使其通过相同的字节数。从64位变量切换到64位变量的速度不会有很大的提高,因为64位变量的轮数确实比32位变量多。
对于两个32位变量,内部状态为256位,对于所有四个64位变量,内部状态为512位。因此,内部状态的可能大小的数量小于最终输出的可能大小的数量。从一个大的内部状态到一个较小的输出可能是好的,也可能是坏的,这取决于您的观点。
如果将输出大小保持不变,通常可以预期,增加内部状态的大小将提高安全性。如果将内部状态的大小保持不变,并减小输出的大小,则冲突更可能发生,但长度扩展攻击可能会变得更容易。使输出大小大于内部状态是没有意义的。
由于64位变体速度更快(在64位CPU上),而且可能更安全(由于内部状态更大),因此引入了两个新的变体,使用64位字,但输出较短。这就是所谓的512/224和512/256。
想要输出比内部状态短得多的变量的原因通常是,对于某些用法来说,使用这么长的输出是不实际的,或者输出需要被用作接受一定大小的输入的算法的关键。
简单地将最终输出截断到所需的长度也是可能的。例如,HMAC结构指定截断最终哈希输出到所需的MAC长度。由于HMAC将一次哈希调用的输出作为另一次调用的输入,这意味着使用输出较短的哈希将导致内部状态较少的HMAC。因此,与使用HMAC-SHA-384相比,使用HMAC-SHA-512并将输出截断到384位可能稍微安全一些。
SHA-2的最终输出仅仅是内部状态(在处理长度、扩展输入之后)被截断到所需的输出位数。SHA-384和SHA-512在相同的输入上看起来如此不同的原因是,为每个变体指定了不同的IV。
发布于 2015-10-16 16:23:02
维基百科:
SHA-2家族由6个哈希函数组成,其摘要(散列值)为224、256、384或512位: SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。
https://stackoverflow.com/questions/33126900
复制相似问题