本文主要是介绍9.5 重放攻击:交易延展性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
先解释下什么叫重放攻击(Replay Attack),顾名思义,重放就是重复播放的意思,因此又称为重播攻击或回放攻击,具体是指攻击者发送一个目的主机已接收过的数据包,来达到欺骗系统的目的。我们来举个例子。
Alice家里安装了一个语音识别的安全门,每次回家的时候Alice只要对着门口说一句:“开门开门,我是 Alice。”这样门就会打开,自从安装了这样一个门以后,Bob再也没法偷偷拿Alice的钥匙去她家了(根本就用不着钥匙啊)。这可怎么办呢?于是 Bob偷偷躲在了Alice门口的角落里,等Alice回家时,用录音笔录下了Alice的语音口令,等下次Bob再到Alice家的时候,就播放这段语 音口令,门就能打开了(欺骗了门的识别系统,系统误以为是Alice的语音口令)。这就是重放攻击的意思了,合法的主人是使用什么样的通信口令来进行身份 认证的,攻击者截获这段通信口令,然后原样的发送给系统,从而欺骗了系统的验证。
那么什么叫交易延展性呢(Transaction Malleability)?延展性是一个形象的称呼。我们知道,在自然界中,有些材料可以经过各种拉伸、锻造来改变形状,但是不会改变材质和质量,比如 黄金白银,历史上我们都曾经使用过这两者作为货币,无论是整块的黄金白银还是碎银子碎金子,无论是打造成元宝的形状还是砖头的模样,都不影响它本身的材质 和质量,我们只要称一下重量,只要符合重量需求,就能照常花出去(接收者都能验证通过)。区块链应用的转账交易功能,也有这样的现象(当然,对于已经修改 了这个问题的应用就不再有这样的问题了),我们以比特币为例来说明这个问题是怎么发生的。
要理解这个问题怎么来的,需要先了解比特币的交易事务的结构,简单地说,比特币在进行转账交易时,会构造一条交易 数据,这条数据中包含了转账者的签名、接收者的地址等重要信息,就如同一张支票一般,按照格式填好了信息后,签上名字就发出去了,发到哪?发到比特币网络 中,让其他节点来共同见证这笔转账,只要验证没有问题,就会被矿工打包到新的区块中,这就算是转账完成了。可是,大家有没有注意到,就这么一张“支票”发 送到网络中,就不怕别人篡改吗?万一某个节点获取到这张“支票”后把金额改掉或者把转账地址改成自己怎么办?放心,这些信息还真改不了。假设Alice转 账一笔1000的金额给Bob,我接收到这个发出来的“支票”数据了,此时我想进行如下修改:
1)将1000的金额改成800;
2)要想修改金额,得拥有Alice的密钥,因为这部分的信息是Alice用自己特有的密码签名敲章的,没有密钥是没法修改的,而且这个密钥可不像日常生活中的公章那样可以随意冒充,这是由特有的密码算法决定的;
3)将Bob的地址替换成我自己的;
4)要想修改Bob的地址,得首先解密这一块的信息,因为这一块的数据是使用Bob的密钥加密的,只有Bob才能解开。
真是一筹莫展啊,那我只想破坏,随便修改掉一些信息行不行?行是行,可是起不到破坏的作用,因为其他节点一旦接收到被修改过的明显有问题的“支票”会直接验证不通过,就被扼杀在襁褓里了。让我们来看一下这个简单的示意图:
如图所示,比特币通过现代密码学技术以及特有的格式设计,确保了攻击者难以对“支票”本身进行破坏性的修改。然而,在 比特币的“支票”中,为了唯一标识这么一笔交易,针对每张支票都计算出了一个ID号,相当于每张支票的唯一标识号,这个标识号是怎么计算出来的呢?它是将 整个支票上的内容包括签名盖的章在内,经过一个哈希计算得出来的,如果这张“支票”的内容就此不发生任何变化了,那么这个标识号也就永远都是那么一个号 了,直到被记录到主链区块中去就算是定案了。
现在还记得前面说的延展性吗?是的,如果有一个办法,稍微改变一下支票的某个能修改的信息,但是仍然保证这张支票 是有效的,能够通过网络中的节点验证,那会发生什么?那就会导致支票上的标识号发生变化(相当于黄金的形状变化了,但是材质和质量仍然没变),标识号为什 么会发生变化,因为标识号的计算方法确保了只要这张“支票”中任何参与计算的内容发生变化,得到的结果就会不一样。
那么,延展性攻击修改了什么?修改的就是Alice的签名。举一个容易理解的例子,假如有一个数字1,现在我要修 改这个数字1,但是修改之后要保证它仍然是代表1,那怎么修改,很简单,我可以把它改成1.0,看到了吧,我只不过是加了个小数位而已,这并不能改变这个 数字的数学意义,它还是代表1,可对于标识号的计算方法来说,这就算是内容发生变化了,它就会计算出另外一个支票标识号。
图中的事务ID就是“支票”标识号的意思,那么,攻击者通过这样的更改能干嘛呢?它可能会导致以下的后果:
1)接收方无法通过原始的事务ID来查询这笔转账;
2)被修改过的交易会与其余在网络中传播的原始交易争抢进入区块,一旦抢先进入了新的区块,原始交易就会被网络中的节点拒绝,虽然不影响转账本身,但是会带来迷惑,而攻击者利用这种迷惑可以达到一些欺骗的目的;
3)阻止原始的交易进入区块。
这种类型的攻击就是属于事务延展性重放攻击。
这个问题有没有解决的方法呢?还是有一些的。其中一项就是隔离见证。隔离见证的方案很简单,既然是因为签名被更改 导致的问题,那就将签名从交易数据中分离出来,放到别的地方,这样做还有一个好处,那就是将签名数据从交易数据中分离后,相当于节约了存储空间,等同于扩 容了,扩容后就能让一个区块容纳更多的交易记录。当然,这种方法也是很有争议的,比特币社区一直都没有统一意见,其中一个原因就是这实际上是一种软分叉方 案(读者可以对比一下软分叉的概念),软分叉本身是带有一定的风险的。2017年5月,莱特币首先完成了隔离见证的激活。(莱特币的源码与比特币基本一 致,只是共识算法不一样,因此有类似问题。)
来源:我是码农,转载请保留出处和链接!
本文链接:http://www.54manong.com/?id=61
这篇关于9.5 重放攻击:交易延展性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!