我正在开发一个基于自定义互联网/线路应用程序级别的协议,目前正在使用SHA1,但是这会低效地增加传输所需的字节数。
该算法应该创建一个小而有效的[Message]哈希值(可以是任何二进制数据)
我搜索了谷歌和维基百科的部分内容,但找不到合适的哈希算法。
所以你知道,协议就像:
[Length] [LengthOfHash][LengthOfMessage][Hash][ Message.... ]
任何人都可以建议或提供有关合适的哈希算法的信息,如果可能的话,还有一个示例实现吗?
答案 0 :(得分:1)
你想用哈希实现什么目标?
您可以将SHA-1哈希截断为您想要的任何长度,但是如果将其截断得太远,攻击者可能会通过暴力破解哈希应该提供的保护。
特别是,基于these benchmarks,即使是有点老化的1.83 GHz桌面CPU也可以评估每个核心每秒大约2 23 SHA-1哈希值。这意味着,如果您将哈希值截断为32位,攻击者可以在不到10分钟的时间内轻松找到所需值的字符串哈希 - 如果他们拥有快速的现代多核CPU,则可以更快。 p>
(当然,还有更快的强力哈希方法。Bitcoin miners喜欢使用显卡,每秒可以apparently达到2 31 哈希值 - 这就是SHA-256,它通常比SHA-1慢约50%。当然,这项工作非常容易并行化,所以你只需支付几美元从Amazon EC2租几百个额外的CPU,甚至购买/构建一些自定义散列破解硬件。或者,如果你是真正的黑帽黑客,只需使用僵尸计算机的僵尸网络,不付任何费用。)
为了对蛮力preimage attacks合理安全,我建议哈希长度至少 64位:即使有1000台计算机,每次尝试2 32 每秒哈希,这仍然需要几个月才能被蛮力破解。
此外,如果您还需要collision resistance(即攻击者无法为您提供两个散列为相同值的不同字符串),那么由于{{3},您需要将其加倍到128位}}。 不管怎样,你也不应该使用SHA-1,因为有birthday effect。请改用known better-than-brute-force collision finding attacks on it函数之一。