风险提示:理性看待区块链,提高风险意识!

什么是重放攻击?

2个回答

态度网友丶马克6星评价

2020-10-13 17:00:02

什么是重放攻击?

重放攻击(Replay Attack)并非区块链技术所特有,其最初指在互联网中,攻击者将拦截到的数据再次原封不动发送给接收方的情况。只要攻击者知晓自己所拦截信息的用途,哪怕信息经过加密,其仍然可以发起重放攻击达到恶意目的,例如窃取存款、窃取账号等。而在区块链中,由于时间戳的存在,重放攻击的定义不同于传统互联网,其表现形式也有相应差异。

如果BTC分裂为一种或多种BTC,如BTC1/BTC2/BTC3等,每个BTC账户内将根据他的BTC余额,同时存在对应数量的所有分叉币。

由于每条链上的地址和私钥、算法等都相同,交易格式也完全相同,导致在其中一条区块链上发起的交易,完全可以放到另一条区块链上去重新广播,可能也会得到确认。这就是“重放攻击”。

如何防止重放攻击?

由于重放攻击会导致链分叉时用户的资金安全性降低,为了保证资金安全,区块链项目多采用不同手段来防止恶意用户发起重放攻击。

首先最常用的方式便是完善交易格式,让分叉点之前即存在的资金所关联的交易只能在一条链上生效,这就要让分叉后的链条在交易结构上做出区别。

对于以升级为目的的分叉而言很容易就能达到,因为硬分叉升级将采用不同的客户端版本,交易的前缀中通常包含有发起交易客户端的版本信息。分叉后矿工为了避免打包旧客户端的“非法交易”(并非恶意交易,仅仅只是版本号过低不被其他节点所承认),通常会拒绝一定版本号以前的交易,保证恶意攻击者很难在硬分叉升级时通过重放攻击窃取资金。

幸福的地方3星评价

2020-10-11 17:01:00

以太坊硬分叉后发生的“重放攻击”和传统计算机术语不是一回事。

传统术语“重放攻击”:指的是身份欺诈。在维基百科上定义很清晰,如下,

假设Alice向Bob认证自己。Bob要求她提供密码作为身份信息。同时,Eve窃听两人的通讯,并记录密码。在Alice和Bob完成通讯后,Eve联系Bob,假装自己为Alice,当Bob要求密码时,Eve将Alice的密码发出,Bob认可和自己通讯的人是Alice。

以太坊硬分叉后产生的“重放攻击”并不是身份欺诈,是一条链上的交易在另一条链也往往是合法的,交易可以重新在另一链上广播,所以才被称为“重放攻击”,但这本质上并不是一种“攻击”。

以太坊在192万区块高度发生了硬分叉,产生了两条链,分别称为ETH chain和ETH Classic chain,上面的代币分别称为ETH和ETHc。这两条链上的地址和私钥生产算法相同,交易格式也完全相同,导致在其中一条链上的交易在另一条链上很可能是完全合法的。所以你在其中一条链上发起的交易,就可以到另一条链上去重新广播,可能也会得到确认。这就是“重放攻击”。

我们使用例子来说,这次以太坊硬分叉后发生的“重放攻击”是这样的:

1.以太坊在第1920000区块高度上硬分叉出来两条链,分别称为ETH chain和ETH Classic chain,上面的代币分别称为ETH和ETHc。

2.在硬分叉高度前的所有ETH都在分叉后的两条链上有用,即持有分叉前的ETH都自动被赠送等额ETHc。

3.某个用户持有在硬分叉高度前的ETH,该用户将自己的硬分叉高度前的ETH通过自己控制私钥的本地钱包(这个无论是ETH chain还是ETH Classic chain钱包都是一样的)发一笔交易到交易所充值到其账户的ETH。但ETH chain和ETH Classic chain都能够识别这一次交易,都是合法的交易,都会打包交易。也就是本来用户是在一条链上广播交易,但可以在另一条链上被“重放”广播了。(你可以自己用钱包去广播,也可能会有人或程序找到你的交易信息帮你去广播)

4.因为用户充值账户是交易所的,对用户来说是一个offchain钱包。如果交易所不给你,那你就丢掉了本来应该属于你的ETHc。

5.如果用户在硬分叉高度前是将ETH存放在交易所,原则上交易所应该是给用户两种币。当用户从交易所提取ETH到本地钱包时,刚好交易被提取的币是在硬分叉高度前的币。而且你又在你自己的电脑上装了两个钱包,分别是ETH chain钱包和ETH Classic chain钱包,而且提币地址在ETH chain钱包上生成,然后通过导入私钥的形式钱地址导进ETH Classic chain钱包上。那你提币的同时,可以在两条链上都广播你的提币交易,这样你的两个本地钱包都能收到等额的币。

6.步骤5里,如果用户只装了一个钱包比如ETH chain钱包,那另一份ETHc就会收不到,但并不会丢,因为你的收币私钥是和你的ETH chain一样的,只要你提取出来这个私钥,然后导入ETH Classic chain钱包就可以了。

7.步骤5里,如果用户提走ETH,是充值到了另一个交易所,比如从yunbi提ETH到P网。这时候P网又只给用户一种币即ETH,那用户就会丢失掉ETHc,丢掉的在谁手上呢,在P网手上。如果用户又回去问yunbi交易所要一份ETHc,yunbi很人品好有担当,真给了,那云币就相当于赔了一份ETHc币。

8.任何持有920万区块高度后的币,情况要更复杂。比如有一笔币从硬分叉前发到硬分叉后的一个地址1上,这个地址1同时在ETH和ETHc都是有效的。那你在ETH chain上收到的币从地址1再次发送到地址2,我们记这笔交易为交易2。这笔交易在ETH Classic chain也是有效的,也是可以被重放的,我们记被重放的这笔交易为交易2'。但如果有办法让交易2发送有效,但让交易2'无效,即ETH chain上的币从地址1成功发送到了地址2,但在ETH Classic chain上从地址1发送到地址2失败了。这种情况下,ETH chain的地址2的币再次交易时就无法被重放到ETH Classic chain上了。

9.步骤8里,什么情况下能让交易2'发送失败呢?也就是怎么样才能解决掉重放攻击呢?其中一个办法就是在交易2'发送后,但0确认前,对交易2'发起双花攻击,即使用相当的私钥再签一次名发起交易2'',将币发到另外一个地址3,如果交易2''成功了,而交易2'失败了,从此ETH chain上的地址2的币和ETH Classic chain上的地址3的币都无法被重放了。

能不能将交易2'在ETH Classic chain上不广播呢?不能,你不广播,会有人帮你广播的,交易信息不是加密的。谁知道哪个狗日的坏人找到你的交易信息后给你广播一下,你的这条分支的币就被发到了这条链的地址2了。

但要想把所有ETH地址和ETHc地址(这两种地址是完全一样的,ETH地址也就是ETHc地址)做到你有币我就没有,那几乎是不可能做到的,地址太多了。也就是想用这个办法彻底解决掉重放问题是不可能的了。

但对于用户来说,你可以使用这个办法分离你的ETH和ETHc,使这两者分另处在不同的地址上,这样你以后就不需要想着在一条链上做了交易我是否需要重放到另一条链了。不过问题又来了,谁会发起双花攻击0确认的交易呢?好像很难啊,所以我认为普通用户基本上是做不到的。交易所应该会。

10.还有一种办法,对其中一条链展开51%攻击,直接消灭掉其中一条链就可以了,让其算力跌到零,从此高度不再上涨,也就是这种链死了。这样问题就彻底解决掉了。

或者让其中一条链的价格跌到很低很低,大家都不关心了,也就懒去理重放交易了。