Hash 自定义协议消息哈希

Hash 自定义协议消息哈希,hash,cryptography,protocols,Hash,Cryptography,Protocols,我正在开发一个自定义的基于internet/wire应用程序级别的协议,目前正在使用SHA1,但是它会低效地增加传输所需的字节数 算法应该创建[消息]的小而有效的散列(可以是任何二进制数据) 我搜索过谷歌和维基百科的部分内容,但找不到合适的哈希算法 你知道,协议是这样的: [Length] [LengthOfHash][LengthOfMessage][Hash][ Message.... ] 是否有人可以建议或提供有关合适的哈希算法的信息,如果可能,还可以提供一个示例实现?您试图通过哈希实现

我正在开发一个自定义的基于internet/wire应用程序级别的协议,目前正在使用SHA1,但是它会低效地增加传输所需的字节数

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

我搜索过谷歌和维基百科的部分内容,但找不到合适的哈希算法

你知道,协议是这样的:

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

是否有人可以建议或提供有关合适的哈希算法的信息,如果可能,还可以提供一个示例实现?

您试图通过哈希实现什么

您可以将SHA-1哈希值截断为您想要的任意长度,但如果截断得太远,攻击者可能会用暴力破坏该哈希值应该提供的保护

特别是,基于此,即使是老化的1.83GHz桌面CPU,每个内核每秒也可以计算223个SHA-1哈希值。这意味着,如果您将哈希值截断为(比如)32位,攻击者可以在不到10分钟的时间内轻松找到任意值的字符串哈希值——如果他们拥有快速的现代多核CPU,甚至更快

(当然,还有更快速的方法来暴力破解散列。比如使用图形卡,每秒可以达到231个散列,而SHA-256的速度通常比SHA-1慢50%。当然,这项工作非常容易并行化,所以你只需支付几美元,就可以从Amazon EC2,o租用几百个额外的CPU或者,如果你是一个真正的黑帽黑客,只需使用僵尸计算机的僵尸网络,并且不支付任何费用。)

为了合理地防止暴力,我建议哈希长度至少为64位:即使1000台计算机每秒尝试232次哈希,暴力破解仍然需要几个月的时间

此外,如果您还需要(即,攻击者无法向您提供两个散列为相同值的不同字符串),那么您需要将其加倍到128位,原因是。
无论如何,您也不应该使用SHA-1,因为有。请改用其中一个函数。

您想用哈希实现什么

您可以将SHA-1哈希值截断为您想要的任意长度,但如果截断得太远,攻击者可能会用暴力破坏该哈希值应该提供的保护

特别是,基于,即使是老化的1.83 GHz桌面CPU,每个核心每秒也可以计算223 SHA-1哈希值。这意味着,如果将哈希值截断为(比如)32位,攻击者可以在不到10分钟的时间内轻松找到字符串哈希值,甚至更快,如果他们拥有快速的现代多核CPU

(当然,还有更快速的方法来暴力破解散列。比如使用图形卡,每秒可以达到231个散列,而SHA-256的速度通常比SHA-1慢50%。当然,这项工作非常容易并行化,所以你只需支付几美元,就可以从Amazon EC2,o租用几百个额外的CPU或者,如果你是一个真正的黑帽黑客,只需使用僵尸计算机的僵尸网络,并且不支付任何费用。)

为了合理地防止暴力,我建议哈希长度至少为64位:即使1000台计算机每秒尝试232次哈希,暴力破解仍然需要几个月的时间

此外,如果您还需要(即,攻击者无法向您提供两个散列为相同值的不同字符串),那么您需要将其加倍到128位,原因是。
无论如何,您也不应该使用SHA-1,因为有。请使用其中一个函数。

@llmari karonen基本上我只想确保从服务器/客户端发送/接收的有效负载是正确的,并且在传输过程中没有被错误修改。当然,它也会阻止一些脚本小子尝试获取免费硬币等。确实如此不需要防弹(如果可能的话)但它不应该很弱。那么你可能需要一个,而不是一个散列。关于截断的问题同样适用,只是碰撞攻击通常与MAC无关,对MAC进行暴力攻击的唯一方法是将猜测的MAC提供给服务器,直到它接受一个。通过适当的速率限制,这可能会让你得到一个对于较短的MAC,虽然为了安全起见,我仍然建议至少使用64位。此外,不要忘记在邮件中包含邮件编号和/或时间戳,以防止重播攻击。“此外,不要忘记在邮件中包含邮件编号和/或时间戳,以防止重播攻击。”你是什么意思?有人可以捕获一条完整的有效消息,比如说“我刚杀了一个怪物,给我一些硬币。”,并重复发送。如果消息中没有任何内容可以让您认识到您以前见过它,则可以给他们提供他们想要的任意数量的免费硬币。也可以提供其他变体,例如,有关详细信息,请参见。@llmari karonen基本上我只想确保从服务器/客户端发送/接收的有效负载是正确的,并且没有错误在传输过程中被错误修改。当然,这也会阻止一些脚本小子尝试获得免费硬币等。它不需要防弹(如果可能的话)但它不应该很弱。那么你可能需要一个,而不是一个散列。关于截断的问题同样适用,只是碰撞攻击通常与MAC无关,对MAC进行暴力攻击的唯一方法是将猜测的MAC提供给服务器,直到它接受一个。通过适当的速率限制,这可能会让你得到一个不过为了安全起见,我还是建议至少使用64位的MAC。另外,不要忘了在发送给prev的消息中包含消息编号和/或时间戳