首页 文章

MD5这样的哈希函数如何独特?

提问于
浏览
53

我知道MD5有一些碰撞,但这更像是关于散列函数的高级问题 .

如果MD5将任意字符串散列为32位十六进制值,那么根据Pigeonhole Principle肯定这不是唯一的,因为存在比唯一的32位十六进制值更多的唯一任意字符串 .

8 回答

  • 2

    根据定义,加密单向散列函数不是Injective . 在哈希函数方面,"unique"毫无意义 . 这些函数由其他属性测量,这些属性通过使得难以创建给定散列的预映像来影响它们的强度 . 例如,我们可能会关心通过更改前映像中的单个位来影响多少图像位 . 我们可能会关心进行暴力攻击的难度(找到给定散列图像的prie-image) . 我们可能会关心找到碰撞的难度:找到两个具有相同散列图像的预映像,以便在_1569696中使用 .

  • 2

    你是正确的,它不能保证唯一性,但在32位十六进制值(16 ^ 32)中有大约3.402823669209387e 38个不同的值 . 这意味着,假设算法背后的数学分布很好,你的几率非常小,会有重复 . 您必须记住,当您考虑如何使用它时,可以复制 . MD5通常用于确定某些内容是否已更改(即,它是校验和) . 如果可以修改某些内容并导致相同的MD5校验和,那将是非常不可能的 .

    编辑:(鉴于最近的新闻:SHA1哈希)上面的答案仍然存在,但你不应该期望MD5哈希作为任何类型的安全检查反对操纵 . SHA-1哈希值碰撞的可能性为2 ^ 32(超过40亿),并且已经证明可以设计输入以产生相同的值 . (很久以前就证明这是针对MD5的) . 如果您希望确保没有人恶意修改某些内容来生成相同的哈希值,那么现在需要SHA-2才能获得可靠的保证 .

    另一方面,如果它不在安全检查环境中,MD5仍然具有它的用处 .

    可以认为SHA-2哈希值足够便宜,无论如何都应该使用它 .

  • 36

    你是绝对正确的 . 但是哈希不是“独特的”,它们是“足够独特” .

  • 5

    正如其他人所指出的,像MD5这样的散列函数的目标是提供一种方法,可以轻松地检查两个对象是否相同,而不知道它们原来是什么(密码)还是完整地比较它们(大文件) .

    假设您有一个对象 O 及其哈希值hO . 您获取另一个对象 P 并希望检查它是否等于 O . 这可能是一个密码,或者是你下载的文件(在这种情况下你不会有 O ,而是最常见的是带有 P 的哈希) . 首先,你哈希 P 得到hP .

    现在有两种可能性:

    • hO和hP不同 . 这必须意味着 OP 是不同的,因为在2个值/对象上使用相同的散列必须产生相同的值 . 哈希是确定性的 . There are no false negatives.

    • hO和hP相等 . 如你所说,由于鸽笼原理,这可能意味着不同的物体散列到相同的值,并可能需要采取进一步的行动 .

    一个 . 因为可能性的数量如此之高,如果你对你的哈希函数有信心,那么说“好吧2128中有一个碰撞的机会(理想情况)”就足够了,所以我们可以假设 O = P . 这可能有效例如,如果限制字符的长度和复杂性,就可以使用密码 . 这就是为什么你看到密码存储在数据库中而不是密码本身的原因.b . 你可能认为仅仅因为哈希值相等并不意味着对象相等,并直接比较 OP . You may have a false positive.

    因此,虽然您可能有误报,但您不会有误报 . 根据您的应用程序,以及您是否希望对象始终相同或始终不同,散列可能是多余的步骤 .

  • 7

    如果要散列的值比生成的散列长得多,则可能会发生冲突,但冲突的数量仍然存在对于大多数目的而言足够低(总共有可能的哈希值,因此两个随机字符串产生相同哈希值的机会在理论上接近于1038中的1) .

    MD5主要用于执行完整性检查,因此它对最小的更改非常敏感 . 输入中的微小修改将导致输出完全不同 . 这就是为什么很难仅根据哈希值猜测密码的原因 .

    虽然散列本身不可逆,但仍有可能通过纯粹的暴力找到可能的输入值 . 这就是为什么你应该总是确保添加一个盐,如果你使用MD5存储密码哈希:如果你在输入字符串中包含一个盐,匹配的输入字符串必须包含完全相同的盐,以便产生相同的输出字符串,因为否则匹配输出的原始输入字符串将在自动salting后无法匹配(即,您不能只是“反转”MD5并使用它来登录,因为反向MD5哈希很可能不会被腌制最初导致创建哈希的字符串) .

    因此哈希不是唯一的,但是可以使身份验证机制足够独特(这是密码限制的一个有点可信的参数,而不是盐析:导致相同哈希的字符串集可能包含许多字符串不遵守密码限制,因此通过暴力破解哈希更加困难 - 显然盐仍然是一个好主意 .

    较大的散列意味着相同输入集的较大可能散列值,因此重叠的可能性较低,但是在处理能力充分提升以使暴力破坏MD5变得微不足道之前,它仍然是大多数用途的不错选择 .

  • 1

    (好像是Hash Function Sunday . )

    加密哈希函数旨在具有非常非常非常低的重复率 . 由于您说明的明显原因,费率永远不会为零 .

    Wikipedia page提供了丰富的信息 .

  • 87

    正如迈克(基本上每个人都说)那样,它并不完美,但它确实起作用,碰撞性能真的取决于算法(这实际上是相当不错的) .

    真正感兴趣的是自动操作文件或数据以保持具有不同数据的相同散列,请参阅Demo

  • 3

    正如其他人已经回答的那样,根据定义,散列函数不能保证返回唯一值,因为对于无限数量的输入存在固定数量的散列 . 他们的关键质量是他们的碰撞是不可预测的 .

    换句话说,它们不容易逆转 - 因此虽然可能有许多不同的输入会产生相同的散列结果(“碰撞”),但找到它们中的任何两个在计算上是不可行的 .

相关问题