迭代哈希

3

我在想,为什么有些库(不管是哪种语言)会使用迭代哈希,将哈希数据编码为十六进制并重新哈希,而不是重新哈希实际的二进制输出?

2个回答

0

-1
这样做是为了引入一个额外的步骤,以防止哈希在直接应用于相同哈希结果的情况下可能开始产生相同或类似的输出。这个额外的步骤独立于哈希实现,并且本身就像另一个重新哈希阶段一样起作用,不会造成任何损害。对于可靠的哈希,这样的预防措施是不需要的 - 但你永远无法预先知道某些哈希算法是否有未知的缺陷。

不,如果您有十六进制输出,可以轻松地将其转换为原始格式,反之亦然。仅仅是哈希输出在重新哈希之前以某种方式进行了转换,就可以提高安全性。关键不在于转换本身,而在于在应用相同的哈希之前进行了转换。 - sharptooth
当我一遍又一遍地思考这个问题时,我无法看到如何将0-255字节映射为0-15字节(不是实际的字节,只是数量)并重新哈希它可以提高安全性。据我所知,情况应该相反。通过再次哈希压缩输出,我们会比哈希实际输出时失去熵。您能否提供任何关于此的事实,或者这只是在压缩数据之前重新哈希可以提高安全性的感觉? - Tower
这恰恰相反。重新散列取决于哈希的好坏,可能什么也不做或者有害。像转换为十六进制字符串这样的转换是为了最小化风险,如果哈希不好并且在重新散列同一块后开始产生相互依赖的输出,则会受到伤害。换句话说,哈希压缩数据,而转换则稍微解压缩数据,以便下一次压缩不会产生类似的块。 - sharptooth
是的,当然。你问为什么哈希输出要重新哈希为十六进制字符串而不是二进制块。当然,十六进制字符串和二进制块是相同的不同表示。但关键是,如果直接重新哈希块,则有可能面临哈希缺陷的风险,而如果哈希其字符串表示,则该风险会降低。 - sharptooth
所以我的问题是,有没有理由使用for()循环一遍又一遍地调用md5_hex(),而不是使用for()循环一遍又一遍地调用md5()函数? - Tower
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接