MD5哈希转换

问题描述 投票:1回答:3

我试图理解的基础是MD5哈希函数如何将任意长度的字符串转换为这么小的长度,但仍表示整个字符串。

我知道它将转换为由16个十六进制值组成的128位输出,但是据我了解,在我看来,单个十六进制值仅代表一个值。例如:在我看来,相对于c ++的ASCII表为0x41为'A'。

很显然,我对MD5函数的理解以及输出如何保留信息是有缺陷的,因此,我正在寻找一种解释以了解这些十六进制如何精确地容纳这么大的字符串。

md5
3个回答
2
投票

您正在将hash functioncompression algorithm混淆。

散列通常是单向操作,一旦被散列,就无法“取消散列”。很好,因为这不是哈希的用途。

哈希函数通常用于将任意长度的东西表示为一致的长度值。例如,SHA2-256将任意数量的二进制数据表示为256位值。它经过设计,即使输入中只有一点点变化,也会导致整个哈希值发生变化,从而使反向哈希过程和“猜测”输入变得十分困难,甚至是不可能的。

这并不是说哈希没有缺陷。著名的MD5是如此之弱,以至于构造两个散列为相同值的二进制字符串并不难,从而产生散列冲突。好的哈希算法可以避免这种情况,但是没有哈希算法可以使之不可能。

事物散列用于:

  • [提供某些内容的“摘要”以检测篡改,例如在您下载的内容的加密签名中。
  • [像散列表或字典中那样,在整个数据结构中“随机”分布数据以避免聚集。
  • 存储不易逆的数据,例如密码。好的密码哈希很难破解,但是相当容易针对候选密码进行测试。

基本上可以创建给定的MD5哈希的二进制文件数量是无限的。对于无损压缩算法而言,情况并非如此,因为按设计方式进行的压缩表示仅表示一个源文档。


1
投票

他们没有。

哈希不能“包含”或“代表”所有这些信息。他们不可能。

它们代表摘要版本,指已删除全部信息的版本。至关重要的是,它们以难以逆转的方式执行此操作,并且在对源数据进行很小的更改时会产生完全不同的哈希(这是故意的:通常使用散列进行快速错误/更改检测) 。

是,这意味着多个输入散列到同一输出。冲突是处理散列时必须考虑的问题。

您可以在Wikipedia或您的安全实践书中阅读有关散列的更多信息。

我知道它将转换为由16个十六进制值组成的128位输出,但是据我了解,在我看来,单个十六进制值仅代表一个值。例如:在我看来,相对于c ++的ASCII表为0x41为'A'。

[使用十六进制数字表示MD5哈希只是一种约定。这并不意味着要使用ASCII表来解释各个字节。


1
投票

散列不包含输入。

无法反转哈希函数,提供输出(哈希)以检索输入。

推论是,它们是可能导致相同哈希值的许多输入;对于给定的哈希,某人可以找到生成该哈希的any(其他)输入,这是非常不可能的。

[SHA0哈希算法最近有了news,因为聪明的人现在能够确定将生成给定哈希值的输入。

© www.soinside.com 2019 - 2024. All rights reserved.