2

我知道不想使用 '\0',但扩展 ASCII 范围内的所有其余部分都可以使用,对吗?

这不会提供更好/安全/“更少的冲突”哈希吗?

4

4 回答 4

4

您是从错误的前提开始的——它们产生的结果可以(确实)包括从 0 到 255 的所有 8 位值。例如,SHA-256 的测试向量之一是“abc”的输入。结果(十六进制)是:

ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad

就在该测试中,结果包括值从 0x03 到 0xff 的字节。

为了显示,可能(通常)以十六进制的形式呈现。对于在电子邮件中传输,它们通常使用 MIME 或 UUENCODE 之类的东西进行编码。然而,散列本身不限于这种方式。

以这种方式转换结果对抗碰撞性没有影响——你仍然有 160/256/任何位的实际数据,但表示被扩展了。

于 2012-06-11T14:14:52.437 回答
0

结果只是十六进制编码以便更好地阅读。

于 2012-06-11T14:05:00.030 回答
0

事实上,那些哈希算法输出的是数字,而不是字符串。它们仅使用字母 af 与数字 0-9 组合,这使得输出成为十六进制数。

于 2012-06-11T14:07:56.230 回答
0

MD5 产生一个 128 位的散列。(16 字节)sha,取决于是 sha1 还是 sha256 产生 160 位(20 字节)或 256 位(32 字节)散列。请注意,我说的是二进制长度/强度。时间越长,发生碰撞的可能性就越小。

大多数用户将其粘贴到 DB 字段或诸如此类的事实使得使用 varions binary-ascii 转换算法将其转换为 ASCII 变得很方便。这根本不应该影响碰撞概率的强度,因为您最终会得到一个更大的 ASCII 字符串。

FWIW 我已经在二进制形式的加密产品中使用 SHA1、SHA256 超过 5 年了,我建议按照以下顺序选择哈希,从最强到最弱:SHA256、SHA1、MD5。有一个网站可以“反转” MD5,所以我强烈建议不要这样做。

于 2012-06-11T14:14:07.763 回答