【问题标题】:Is any substring of a hash (md5, sha1) more "random" than another?哈希(md5,sha1)的任何子字符串是否比另一个更“随机”?
【发布时间】:2011-04-18 16:42:19
【问题描述】:

这里有 3 个示例 md5 哈希

$ md5 -s "1" && md5 -s "2" && md5 -s "3"
MD5 ("1") = c4ca4238a0b923820dcc509a6f75849b
MD5 ("2") = c81e728d9d4c2f636f067f89cc14862c
MD5 ("3") = eccbc87e4b5ce2fe28308fd9f2a7baf3

假设我想从任何哈希中提取 8 个字符。哈希的开头部分是否比结尾更“随机”?中间?还是所有子字符串都同样“随机”?

【问题讨论】:

  • 在我看来,“随机”在这里并不合适。散列函数具有确定性;根本不涉及随机性。您可能会问哈希的子字符串是否与原始字符串具有相同的抗串通性(当然要考虑不同的长度)。
  • 我正要问这个问题..

标签: md5 sha1 hashcode sha256


【解决方案1】:

可以使用对伪随机数生成器进行的统计测试来测量哈希函数输出的随机性。 根据Handbook of Applied Cryptography §5.4.4(免费提供示例章节),有五个基本测试:

  1. 频率测试(单比特测试)
  2. 串行测试(两位测试)
  3. 扑克测试
  4. 运行测试
  5. 自相关检验

当然,还有 kurige 已经提到的 Maurer 通用统计检验。

【讨论】:

    【解决方案2】:

    Nitpick:在这里使用“随机”这个词是错误的,因为哈希函数是确定性的。

    至于回答你的意思:),哈希函数的一个理想属性是实现Avalanche effect:基本上,每一位输入都会导致输出发生巨大变化。因此,对于一个设计良好的散列,每个子串都应该受到同样频繁的影响(“be as random”)。

    【讨论】:

    • 出于这个原因,我将 random 这个词放在引号中 :) +1 用于链接到雪崩效应。
    • 这应该是答案,因为它准确地回答并表达了why的原因
    【解决方案3】:

    我自己很好奇,所以我继续写了program 来测试这个。你需要Crypto++ 来编译代码。

    免责声明: 谈到密码学,甚至只是一般的数学,我知道的足以让我自己开枪了。因此,请对以下结果持保留态度,并请记住,我对我正在使用的工具只有粗略的了解。

    我只采样了三个子字符串:前 8 个字节、中间 8 个字节和最后 8 个字节。长话短说,它们同样随机。

    但是,当使用较小的样本空间时,最后 8 位似乎更加随机。采样空间越大,三个子串越接近完全随机性。


    1000 次迭代:

    First:  0.995914
    Middle: 0.996546
    Last:   0.998104
    

    5000 次迭代:

    First:  0.998387
    Middle: 0.998624
    Last:   0.999501
    

    10000 次迭代:

    First:  0.999614
    Middle: 0.999457
    Last:   1
    

    30000 次迭代:

    First:  1
    Middle: 1
    Last:   1
    

    “随机性”由 Crypto++ 的 MaurerRandomnessTest 类测量。作为参考,从上述代码编译的可执行文件的随机性值为0.632411,从古腾堡计划下载的莎士比亚的麦克白副本的随机性值为0.566991

    【讨论】:

      【解决方案4】:

      一个好的散列的所有子串(尽管 md5 在密码学上是不安全的但相当好)都是同样随机的,所以是的,从字符串中取任何你喜欢的位,它们应该是均匀分布的。

      【讨论】:

        猜你喜欢
        • 2010-10-26
        • 2018-12-10
        • 1970-01-01
        • 2011-01-28
        • 2011-08-16
        • 2013-06-17
        • 2019-08-08
        • 2020-03-29
        • 1970-01-01
        相关资源
        最近更新 更多