你不能不知道的重放攻击与保护

    以前讲到重放攻击与保护都是一些技术活,是开发者要注意的事情。现在随着分叉的越来越频繁和无节操(尤其是比特币分叉),普通用户也需要了解什么是重放攻击以及如何保护,否则相应资产可能会受到损失。

    重放攻击(Replay attack)分为链之间的重放攻击和链内重放攻击两种。链之间的重放攻击主要是针对分叉链。我们先通过BCC的例子来讲解链之间的重放攻击。

    BCC是BTC的一条分叉链,在未作特殊处理的情况下,两条链是一模一样的。假设Alice在分叉前拥有10BTC在地址:18mpPyy6Z1rUVnjrKTsznHxJ4Wku6VqrJV 上,那么分叉后她也将拥有10BCC在同样的地址上。

    这时Alice将这10个BTC转账给其好友Bob的地址:1GpysEyaGJE6Zu8mQ6eV1e1hvxZ3XY39ni上。当Bob在BTC网络上收到这笔交易后,只要简单的将该交易信息广播至BCC网络上,Alice的10个BCC 也将自动转给了Bob,于是Bob轻松地盗取了Alice的10个BCC。

    以上例子就是重放攻击。因为两条链一模一样,所有的地址、签名、交易在两条链上都有效。未为重放攻击做特殊处理的分叉链也被叫做没有重放保护的分叉链,正如我们上面的例子看到的,这种情况是很危险的。因此绝大多数分叉链是做了重放保护的。那么如何做重放保护呢?

    我们还是通过BCC的例子来看如何做重放保护。我们上面说了,两条分叉链的所有地址、签名和交易都是有效的。很显然我们需要让在BTC的上交易在BCC网络上变得无效,反之亦然。BCC是做法是在做签名的时候,在SIGHASH_TYPE上增加了一个FORK_ID的位,并将自己的FORK_ID设置为0x40。也就是说BCC网络使用了区别于BTC网络的SIGHASH_TYPE。因此BCC交易的签名结果在BTC网络上验证不通过,反之亦然。这样便实现的BCC/BTC网络的双向重放保护。

     

    因此BCC分叉后普通用户不需要做什么特殊处理,相应的资产已经得到的内置的双向重放保护。但是本月(11月)中旬可能要进行的2X分叉则不然。因为即将要分叉的B2X和原先的BTC(SegWit1x)都认为自己都正统的比特币,都不愿意在自己的签名算法上加上FORK_ID的参数。因此极有可能出现两条一模一样的分叉链,即没有任何的重放保护。即你在B2X网络上一笔转账(转给其他人的地址),可以轻松被重放的BTC网络上,从而偷走你的币,反之亦然。

    这种情况下我们(普通用户)需要主动采取措施进行重放保护,这很重要,具体步骤如下:

    1. 下载B2X钱包,用你的助记词恢复出B2X分叉币;
    2. 在BTC钱包和B2X钱包各自创建两个不同的新地址,如BTC钱包里创建地址A,B2X钱包里创建地址B;
    3. 将BTC钱包里的所有币转至地址A,将B2X钱包里所有币转至地址B;

    这样便完成了主动的重放攻击保护。因为你在不同网络里的币位于不同的地址上,以后交易都将采用不同的私钥签名,即使在签名算法、SIGHASH_TYPE完全一致的情况下,在BTC里生效的交易将在B2X网络无法生效,因为其找不到对应的UTXO,反之亦然。

    如果最终B2X分叉未做任何重放保护,则以上步骤很重要,不然你的比特币可能莫名失踪!!!

    另外一种重放攻击是链内的重放攻击。这种攻击在比特币这样基于UTXO的网络里并不存在,而在以太坊这样基于账户系统的网络则非常普遍。因此以太坊实施了内置的重放保护措施。但是它是如何做的呢?

     

    以太坊通过每个账户内置的nonce值来解决链内重放攻击的问题。nonce值从0开始计数,每发出一个交易加1。矿工在接受交易时比较交易里携带的nonce值和该账户当前worldstate中的nonce值,如果一致则接受交易,否则丢弃。

    链内重放攻击相对容易解决,而链之间的重放攻击则需要分叉链主动做出保护,否则很容易使用户资产受到损失。没有哪个用户期望分叉的产生,然而如果分叉必须要产生,也请相应开发人员主动做出重放保护,而不是因为利益之争弃用户利益于不顾。作为普通用户则不能寄希望于相应分叉者们的良心发现,提前做好准备,保护好自己的资产!

    转载请注明:比特阁 » 你不能不知道的重放攻击与保护

    喜欢 0

还没有人抢沙发呢~