【问题标题】:How to measure hash algorithm strength如何衡量哈希算法的强度
【发布时间】:2012-04-15 12:50:46
【问题描述】:

有没有办法衡量哈希算法的强度?例如,一个用 PHP 编写的标准化测试来衡量 cryptsha1 的强度?

力量可以指各种各样的东西;单个家用计算机可以通过彩虹表或字符循环、密码中的位长度或符号和数字的使用来发现密码的能力。与发现符号或字符数的简单正则表达式不同,可以确定强度的 PHP 函数的要求是密码、密钥或盐的破解速度。

我想知道 PHP 的散列算法列表中哪种散列算法最好。

foreach (hash_algos() as $algorithm) {
    // test strength
}

【问题讨论】:

  • 哈希的“强度”对您来说究竟意味着什么?它有几种含义?为什么它对你如此重要?你用它做什么?
  • 在最先进的散列算法中发现弱点是研究级密码学。如果有一种算法,很多聪明人会失业(或者至少以不同的方式度过他们的时间)。
  • 你最好在谷歌上搜索比较 - 很多人都写过关于每种类型和好处等的文章。
  • @safarov:我认为没有多少长度为 2^128 的哈希算法......
  • @safarov 不要将位数与数字范围混淆。一个 128 位整数需要 16 个字节来存储并允许 2^128 个值,这对于 hashign 算法来说是相当多且明智的。一个 2^128 位整数需要 10^25 TB 来存储并允许 2^(2^128) 个值(这个数字有 10^38 个十进制数字) - IOW,这太不切实际了。但无论如何,我的观点是:输出数字范围与算法的强度(通过任何合理的强度定义)几乎没有关系。 [Wolfram|Alpha 带给你的所有数字]

标签: php algorithm hash


【解决方案1】:

哈希的强度是一个数学/理论概念,即是否发现了任何理论或实际差异。

如果没有公开的弱点,那么优势就是摘要的长度。例如。 SHA-1 有 160 位输出,而 SHA-256 有 256 位输出。

“以编程方式”测试强度的唯一方法是暴力破解哈希,这几乎没有意义。

最好自己研究每个散列,而不是尝试以编程方式确定“最佳”散列。

【讨论】:

    【解决方案2】:

    散列算法将任意输入映射到n 位的输出序列。 “好的”散列算法将每个长度为n 位的输入映射到一个不同n 位输出序列。当两个不同输入映射到相同输出时,就会发生冲突

    因此,测试两种哈希算法的比较强度的一种简单方法是生成大量输入,将它们提供给两种算法,然后计算冲突次数。

    请注意,“简单”的意思是“概念上简单”。执行实际测试将需要大量的计算资源。

    【讨论】:

    • 必须发生冲突,因为可以散列的位数是有限的,而序列的数量是无限的。并不是说您不知道,而是认为您的回答是指出这一点的好地方。
    • 最佳哈希将n 位的输入映射到n 位的输出而不会发生冲突。只有当输入的长度大于输出的长度时才会发生碰撞。
    • @AdamLiss:我不认为这真的是重要的标准。一个更重要的衡量标准是构建导致给定输出的输入的难易程度。
    • @AdamLiss:一点也不。我确定 MD5 符合您所描述的属性,但现在认为 MD5 不安全的原因是它“相对”容易恶意创建产生冲突的输入。
    【解决方案3】:

    我认为从数学角度来看,如果存在这样的算法,那么在给定其他适当输入的情况下,考虑算法计算密钥的运行时间是一种好方法。

    根据我最近使用一些基本加密算法的工具,我可以说即使是基本指数密码也能找到 k 的最快算法在 e^(sqrt(log p log log p) 中运行,这使得它不可行大p。看起来这将是一个很好的“强度”理论测量。

    我绝不是这方面的专家,Gavin 和 Adam 似乎知识渊博得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-23
      • 2012-06-03
      • 2021-05-03
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多