如果散列算法具有选择输出散列长度的选项(例如,128 位与 512 位),并且散列函数的所有其他方面都相同,则哪个散列长度可能更安全/有用,以及为什么?
哪个哈希长度更安全?
哈希如何工作
哈希背后的概念非常简单:获取任意大小的消息,并确定性地生成给定大小的随机输出。对于构建良好的密码散列函数,破解它的唯一方法是尝试随机输入,直到获得所需的散列值(碰撞或原像等)。
哪个更安全?
在所有其他条件相同的情况下(即,它是相同的算法,只是输出大小不同,例如:SHA2-224 与 SHA2-512),那么散列的输出越大,它就越安全。原因:如果你有一个224位的散列,那么你预计攻击者必须进行2223次猜测(平均)才能破解它,而 512 位则需要攻击者进行2511次猜测(平均)。
哪个更有用?
这个我不能为你回答,这取决于很多关于使用它的应用程序的因素。例如,无论您是否有内存、带宽或处理限制,如果 128 位哈希被弃用,您是否能够轻松升级基础架构,或者您设置的解决方案需要 10 年面向未来,等等。仅凭您提供的信息,我无法为您回答。
最长的散列是最安全的,因为随机发现冲突的概率较低。但是更长的哈希值也需要更长的时间来计算和检查,特别是如果人必须检查它,所以为了微小的安全改进可能不值得使用更长的哈希值。
第一个明显的答案当然是“512 位散列更好”。
一个更体贴的答案会补充说:“......如果输入足够长”。原因是,虽然我们希望世界和该世界中的哈希是完美的,但在给定较小输入的情况下,通常更难在较大的输出中生成近乎完美的随机分布。因此,如果输入太短,与较短的哈希相比,较长的哈希可能具有不良属性。
一个更实际的答案会问:你是生日吗?如果没有,忘记这个问题,只使用 128 位哈希,它更快并且使用更少的存储空间。
如果生日攻击对你来说可能是个问题(签名?),你肯定不想使用 128 位(或更小)的哈希,因为 2 64是一个非常可行的攻击数字。
除此之外,除非所涉及的某些信息非常有价值,以至于世界上一个或几个最大的国家将投入其大部分资源和他们假定的超级量子计算机数年来暴力破解你的一个散列(你有多重要!?),任何未损坏的散列 - 在实践中 - 就长度而言与其他任何散列一样好。
攻击者是否必须执行 2 127或 2 511或 2 10000000步并没有区别。
如果可能的话, 2 127绝对是不切实际的,并且无法承受(对于每个现实场景)。
哈希的一种用法是数据签名或校验和。
假设我提供了一个文件供您下载,并且一旦您下载了该文件,您可能需要确保它没有被触及(被中间人、坏网络等),所以解决方案来了。
我为您提供文件的校验和/哈希(假设在 SHA-512 中),现在您检查下载文件的校验和/哈希,并且两个哈希文件现在必须相同(但如果您假设提供的哈希数据为否也摸过)。
您可能会惊讶于 MD5 现在是一种已弃用的哈希算法。由于安全传说可以以一种非常棒的方式破解它,您可以拥有两个完全不同的数据,它们具有完全相同的大小和完全相同的 md5 哈希值。
所以现在我不担心明年可能会有 10 或 100 个传奇人物对 SHA 家族做同样的事情。
HMAC
s 是哈希的安全方式。因为您需要添加更多秘密数据来制作哈希。回到上面的文件下载示例,现在您需要制作一个 HMAC-SHA-512 来检查数据完整性,其中包含一些只有您和我知道的秘密值。(秘密 val 也称为 salt)。
更安全?世界上谁都不能信任?HMAC 不起作用
所以最后一种方法是您自己定制的哈希算法。是的,自己做。但显然你需要做得很好。