MD5 哈希转换
MD5 Hash Conversion
我想了解的基础是 MD5 哈希函数如何将任意长度的字符串转换为如此小的长度,但仍然代表整个字符串。
我知道它转换为由16个十六进制值组成的128位输出,但据我了解,一个十六进制值在我看来只能代表一个值。例如:在我看来,0x41 与 C++ 相关的 ASCII table 将是 'A'.
很明显,我对 MD5 函数以及输出如何保存信息的理解存在很大缺陷,因此我正在寻找解释以了解这些十六进制究竟如何保存如此大的字符串。
他们没有。
哈希不会 "contain" 或 "represent" 所有这些信息。他们不可能。
它们代表一个摘要版本,一个删除了全部信息的版本。至关重要的是,他们以一种难以逆转的方式做到这一点,并且在仅对源数据进行微小更改时产生完全不同的散列的方式(这是故意的:散列通常用于快速 error/change检测)。
是的,这意味着多个输入散列到相同的输出。处理哈希时必须考虑冲突。
您可以在维基百科或您的安全实践书中阅读更多关于散列的信息。
I understand that it converts to a 128bit output which is composed of 16 Hexadecimal values, but from what I understand, a single Hex value in my mind would only represent one value. Ex: 0x41 in my mind with the ASCII table in relation to c++ would be 'A'.
使用十六进制数字表示 MD5 哈希只是一种约定。这并不意味着要使用 ASCII table.
解释各个字节
你混淆了 hash function with a compression algorithm。
散列通常是一种单向操作,即一旦散列后就无法 "un-hash" 某些内容。这很好,因为这不是哈希的用途。
哈希函数通常用于将任意长度的东西表示为一致的长度值。例如,SHA2-256 将任意数量的二进制数据表示为 256 位值。它的设计使得即使输入中的一个位变化也会导致整个哈希值发生变化,这使得反转哈希过程和"guess"输入变得困难甚至不可能。
这并不是说哈希没有缺陷。著名的 MD5 非常弱,不难构造两个散列为相同值的二进制字符串,从而产生 散列冲突 。一个好的散列算法使这不太可能,但没有任何散列算法可以使它不可能。
事物哈希用于:
- 提供某些内容的 "digest" 以检测篡改,例如您下载的内容的加密签名。
- 在数据结构中分布数据 "randomly" 以避免聚集,如在散列 table 或字典中。
- 存储不应轻易撤消的数据,例如密码。一个好的密码散列值很难通过暴力猜测,但相对于候选密码来说相当容易测试。
基本上有无数个二进制文档可以创建给定的 MD5 哈希。对于无损压缩算法,情况并非如此,因为设计的压缩表示代表一份且仅一份源文档。
哈希不包含输入。
您不能反转散列函数,提供输出(散列)来检索输入。
由此得出的结论是,它们是许多可能导致相同散列的输入;对于给定的散列,有人可以找到生成它的任何(其他)输入是非常不可能的。
最近 news 关于 SHA1 散列算法,因为聪明的人现在能够确定将生成给定散列的输入。
我想了解的基础是 MD5 哈希函数如何将任意长度的字符串转换为如此小的长度,但仍然代表整个字符串。
我知道它转换为由16个十六进制值组成的128位输出,但据我了解,一个十六进制值在我看来只能代表一个值。例如:在我看来,0x41 与 C++ 相关的 ASCII table 将是 'A'.
很明显,我对 MD5 函数以及输出如何保存信息的理解存在很大缺陷,因此我正在寻找解释以了解这些十六进制究竟如何保存如此大的字符串。
他们没有。
哈希不会 "contain" 或 "represent" 所有这些信息。他们不可能。
它们代表一个摘要版本,一个删除了全部信息的版本。至关重要的是,他们以一种难以逆转的方式做到这一点,并且在仅对源数据进行微小更改时产生完全不同的散列的方式(这是故意的:散列通常用于快速 error/change检测)。
是的,这意味着多个输入散列到相同的输出。处理哈希时必须考虑冲突。
您可以在维基百科或您的安全实践书中阅读更多关于散列的信息。
I understand that it converts to a 128bit output which is composed of 16 Hexadecimal values, but from what I understand, a single Hex value in my mind would only represent one value. Ex: 0x41 in my mind with the ASCII table in relation to c++ would be 'A'.
使用十六进制数字表示 MD5 哈希只是一种约定。这并不意味着要使用 ASCII table.
解释各个字节你混淆了 hash function with a compression algorithm。
散列通常是一种单向操作,即一旦散列后就无法 "un-hash" 某些内容。这很好,因为这不是哈希的用途。
哈希函数通常用于将任意长度的东西表示为一致的长度值。例如,SHA2-256 将任意数量的二进制数据表示为 256 位值。它的设计使得即使输入中的一个位变化也会导致整个哈希值发生变化,这使得反转哈希过程和"guess"输入变得困难甚至不可能。
这并不是说哈希没有缺陷。著名的 MD5 非常弱,不难构造两个散列为相同值的二进制字符串,从而产生 散列冲突 。一个好的散列算法使这不太可能,但没有任何散列算法可以使它不可能。
事物哈希用于:
- 提供某些内容的 "digest" 以检测篡改,例如您下载的内容的加密签名。
- 在数据结构中分布数据 "randomly" 以避免聚集,如在散列 table 或字典中。
- 存储不应轻易撤消的数据,例如密码。一个好的密码散列值很难通过暴力猜测,但相对于候选密码来说相当容易测试。
基本上有无数个二进制文档可以创建给定的 MD5 哈希。对于无损压缩算法,情况并非如此,因为设计的压缩表示代表一份且仅一份源文档。
哈希不包含输入。
您不能反转散列函数,提供输出(散列)来检索输入。
由此得出的结论是,它们是许多可能导致相同散列的输入;对于给定的散列,有人可以找到生成它的任何(其他)输入是非常不可能的。
最近 news 关于 SHA1 散列算法,因为聪明的人现在能够确定将生成给定散列的输入。