1

我正在开发一个基于互联网/有线应用程序级别的自定义协议,目前正在使用 SHA1,但是它没有有效地增加传输所需的字节数。

该算法应该创建一个小而有效的 [Message] 散列(可以是任何二进制数据)

我搜索了谷歌和部分维基百科,找不到合适的哈希算法。

所以你知道,协议是这样的:

[Length] [LengthOfHash][LengthOfMessage][Hash][ Message.... ]

任何人都可以建议或提供有关合适的哈希算法的信息,并在可能的情况下提供示例实现吗?

4

1 回答 1

1

你想用哈希实现什么?

您可以将 SHA-1 哈希截断为您想要的任何长度,但如果您将其截断太远,攻击者可能会通过蛮力破坏哈希应该提供的保护。

特别是,基于这些基准测试,即使是稍微老化的 1.83 GHz 台式机 CPU,每个内核每秒也可以评估大约 2 23 SHA-1 哈希值。这意味着,如果你将散列截断为 32 位,攻击者可以在不到 10 分钟的时间内轻松找到一个字符串散列到他们想要的任何值——如果他们拥有快速的现代多核 CPU,甚至更快。

(当然,还有更快的方法来蛮力散列。比特币矿工喜欢使用显卡,它显然可以达到每秒2 31个散列 - 这是针对 SHA-256 的,它通常比 SHA 慢 50% -1. 当然,这项工作非常容易并行化,因此您只需支付几美元即可从 Amazon EC2 租用几百个额外的 CPU,或者甚至购买/构建一些自定义哈希破解硬件。或者,如果您重新成为真正的黑帽黑客,只需使用您的僵尸计算机僵尸网络,无需支付任何费用。)

为了相当安全地抵御暴力原像攻击,我建议哈希长度至少为64 位:即使有 1000 台计算机每台每秒尝试 2 32次哈希,暴力破解仍然需要几个月的时间。

此外,如果您还需要抗碰撞性(即攻击者无法向您提供两个哈希值相同的不同字符串),那么由于生日效应,您需要将其加倍至 128 位。无论如何,您也不应该使用 SHA-1,因为有已知的比蛮力碰撞发现攻击更好。请改用其中一种SHA-2函数。

于 2013-03-01T13:11:27.010 回答