区块链技术学习(微信号:Blockchain1024)翻译
原文链
接:
https://medium.com/@craig_10243/the-puzzle-of-the-double-hash-968196edb06d
比特币内部有一个长期存在的谜团尚未正确解决:为什么我要使用双重哈希(double hash)?
首先,CoreCoin wiki中给出的双哈希问题的解释是完全错误的。
CoreCoin wiki地址:
https://en.bitcoin.it/wiki/Hashcash#Double_Hash
如果您对一个值进行双重哈希,则生日攻击仍然存在。如果有两个值散列到相同的结果,形成生日攻击或碰撞,它们仍然会碰撞。这很容易展示。假设我们有两个值 X 和 Y,对于给定的哈希函数,我们有这样一个碰撞:
A == Hash(X) == Hash(Y)
现在,给定 X 和 Y 哈希到相同的值 A 的结果,我们可以很容易地看到,任何双哈希或平方哈希过程都不会有所帮助,因为:
Hash(A) == Hash[Hash(X)] == Hash[Hash(Y)]
实际上,我们丢失了用于附加哈希操作的一位信息。我们可以说,如果我们迭代一个哈希n次,那么发生碰撞的可能性就会增加n倍。我在这里比较自由,我所解释的所涉及的数学并不完全准确,但事实是,每次我们使用相同的哈希函数重新哈希一个函数,我们就会失去该函数的碰撞安全性。
事实上,如果我们看看比特币中的地址是如何创建的,我们会看到双哈希函数会进一步影响效果。换句话说,该方案中哈希的哈希更有可能导致冲突,而不是单个哈希,甚至是同一哈希函数的哈希(双哈希)更有可能导致碰撞。
A == Hash-a(X1) == Hash-a(Y1)
B1 == Hash-a(X2)
B2 == Hash-a(Y2)
如果B1 = B2,那么就是A的场景。
但是,也会存在这样的价值观:
C == Hash-b(B1) == Hash-b(B2)
因此,当我们使用单独的哈希函数(例如SHA256和RIPEMD160)时,在两个值(即两个独立的公钥)之间发生碰撞的概率就会增加(不仅仅是使用双哈希)。
所以,我必须指出,在这个领域(和其他很多领域一样),比特币,抱歉,CoreCoin wiki是错误的。比特币内部没有使用双重哈希来提高安全性。在寻址过程中,它确实增加了一个好处,如果一个哈希函数被发现是脆弱的,那么另一个哈希函数将保持更长时间的安全,但是和上面的场景一样,更容易发生碰撞。所以,不幸的是,这种表面上的好处并不是采用双哈希的原因。
Ferguson和Schneier( 实用密码学 )提出使用双哈希函数来抵御SHA-256的“长度扩展”攻击,并将其命名为SHA-256d。像MD5或SHA-256这样的
Merkle-Damgård
哈希函数很容易受到这种攻击。如果这是一个问题,我们本可以使用HMAC,但事实是,比特币是一个经济系统。比特币的安全性总是与攻击成本和防御成本有关。
Merkle-Damgård 地址:
https://en.wikipedia.org/wiki/Merkle%E2%80%93Damg%C3%A5rd_construction
虽然特定SHA-256( k||d )的计算可能存在长度扩展攻击,但也很容易被检测、监视和阻止。在我看来,找到符合场景的脚本并不是一个真正的问题。事实上,这真的不是一个问题,但我不会在这里详细说明。现在有很多更好的方法可以阻止比特币的长度扩展攻击。这也是剧本力量的一部分。
那么,如果它降低了安全性,我们为什么要这么做呢?
我们有一系列的专利涵盖了所有这一切。不幸的是,由于那些虚假比特币分叉的原因,使得人们有必要为人们不理解的许多技术申请专利。比特币中双哈希函数的一个用途,是在比特币扩容时,对个别验证函数特定化。
如果你开始思考,你会发现:
A == Hash(X),
现在:
B == Hash(A)
我们将 (A) 值发送给矿工,但不允许他们在没有个人交易的情况下广播一个块。在Merkle树结构中,我们可以发送并解决除单个事务之外的所有块。这样做将允许我们构建一个ASIC 挖矿设备,它不以块的形式存储数据,矿工现在是一个分布式函数。
因此,工作证明和验证可以交给专门实体。ASIC设备可以在发现有效块时将费用支付给验证设备,但是系统可以做到不让他们相互欺骗但可以相互交流。事实上,他们甚至可以与不同的矿商和矿池达成协议,并且不必担心出现问题:如果一方作弊,双方都会输。
从设施在哪里的问题开始,事情变得有趣起来。中国和中亚许多地方有电力,但没有网络接入。能够分发这些功能是很有价值的。