专栏名称: 区块链技术学习
致力于区块链技术的学习和普及,对区块链技术和相关企业事件进行深度分析和研判,探索去中心化账本技术应用领域。
目录
相关文章推荐
河北交通广播  ·  【992 | 热搜】演员王某被抓! ·  16 小时前  
河北交通广播  ·  突发!一高速桥梁坍塌,已致伤亡…… ·  20 小时前  
河北交通广播  ·  【992 | ... ·  昨天  
河北交通广播  ·  【992 | 祝贺】王曼昱夺冠! ·  2 天前  
河北交通广播  ·  大规模!特斯拉紧急召回37.5万辆车! ·  3 天前  
51好读  ›  专栏  ›  区块链技术学习

为什么我要使用双重哈希(double hash)?

区块链技术学习  · 公众号  ·  · 2019-05-15 12:30

正文

区块链技术学习(微信号: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设备可以在发现有效块时将费用支付给验证设备,但是系统可以做到不让他们相互欺骗但可以相互交流。事实上,他们甚至可以与不同的矿商和矿池达成协议,并且不必担心出现问题:如果一方作弊,双方都会输。


从设施在哪里的问题开始,事情变得有趣起来。中国和中亚许多地方有电力,但没有网络接入。能够分发这些功能是很有价值的。







请到「今天看啥」查看全文


推荐文章
河北交通广播  ·  【992 | 热搜】演员王某被抓!
16 小时前
河北交通广播  ·  突发!一高速桥梁坍塌,已致伤亡……
20 小时前
河北交通广播  ·  【992 | 祝贺】王曼昱夺冠!
2 天前
河北交通广播  ·  大规模!特斯拉紧急召回37.5万辆车!
3 天前
中国医疗保险  ·  药品集中采购,路在何方?
7 年前
济宁城网事  ·  这才是真正的艳遇,笑死不管!
7 年前
Clinic門诊新视野  ·  第十八届中国心律学大会 APP 闪亮登场
7 年前