【发布时间】:2018-04-10 09:57:31
【问题描述】:
对于 CRC32,可以组合两个哈希,这样给定两个流 A 和 B,我们可以找出 CRC(A+B) 只知道 CRC(A)、CRC(B) 和长度(B) . (实现可用 here,以及 Mark Adler here 对其工作原理的解释)。
这让我们可以并行计算单个流上的哈希值,或者计算大型 上的哈希值(如“不适合内存”)仅在其包含媒体上使用前向搜索的分段流(这为非常慢的媒体上的加速提供了巨大的潜力)。
似乎没有可用于其他更复杂的散列算法(如 MD5)的此类行为的实现。这种行为在 MD5 中根本不可能吗?是不是很难做到没有人愿意尝试?更复杂的算法,如 SHA1 或 SHA256 呢?我很想听听对此的任何见解。
【问题讨论】:
-
流式散列很常见;这是一个 PHP 示例:php.net/manual/en/function.hash-init.php。但是,这些算法在流式传输期间可能需要更多的上下文,而不仅仅是
md5(A)、md5(B)和length(B)。 -
我实际上在问一些不同于流式散列的东西。我知道我可以执行 Init()、Update(A)、Update(B)、Z=Finalize()。我正在尝试执行 Init()、Update(A)、X=Finalize()、Init()、Update(B)、Y=Finalize()、Z=Combine(X,Y)。使用 CRC32 是可能的,但我觉得使用任何更复杂的流行哈希算法我都不走运。
-
MD5、SHA1 和我知道的所有其他 cryptographic 散列函数不具有 CRC 所具有的代数属性。任何此类属性都将代表加密环境中的毁灭性弱点。特别是,它们都不能像 CRC 那样在单独的块上并行计算。
-
这就是我害怕的。谢谢!
标签: hash md5 sha1 sha256 crc32