主页 > imtoken制作冷钱包 > 揭秘以太坊“后走私时代”的窃取方式

揭秘以太坊“后走私时代”的窃取方式

imtoken制作冷钱包 2023-04-25 07:45:04

以太坊私钥生成过程_以太坊和以太经典未来哪个好_以太坊离线生成账号

以太坊作为区块链2.0时代的代表,通过智能合约平台解决了比特币可扩展性不足的问题,在金融行业有着巨大的应用。

通过智能合约进行交易,无论交易时间如何,无论交易是否合法,只要能够遵守智能合约的规则,就可以进行无限制的交易。 总会有人背道而驰,获得巨大的经济利益。

2018年6月29日,以太坊黑色情人节事件(即偷渡者漏洞)的新攻击方式被发现。 这种攻击方式在本文中也被称为:离线攻击。 在结合蜜罐数据复现这种攻击方式的过程中以太坊私钥生成过程,我们发现在真实场景中,还有另外两种新的攻击方式:重放攻击和爆破攻击。 由于这类攻击方式是在偷渡者漏洞被曝光后出现的,所以我们将这些攻击方式统称为后走私时代的偷钱方式。

介绍完相关知识点后,下面将针对后走私时代的走私漏洞和窃取手段,模拟赃款再现的实际过程,分析攻击成功的要点。

一、重点知识点

1.1 RLP编码

RLP(recursive length prefix)从名字就可以看出它的特点:一个是递归的,编码后的数据是递归结构,编码算法也是递归处理的; 其次是长度前缀,即RLP编码有一个前缀,这个前缀与编码数据的长度有关。 RLP 提供了一种适用于任意二进制数据数组的编码。 RLP 已经成为以太坊中序列化对象的主要编码方式。

RLP 编码将序列化字符串和列表。 具体编码过程如下:

以太坊离线生成账号_以太坊私钥生成过程_以太坊和以太经典未来哪个好

这里以3.4.1节eth_signTransaction接口返回的签名数据为例,说明签名数据经过tx编码后是如何得到的。

以太坊离线生成账号_以太坊私钥生成过程_以太坊和以太经典未来哪个好

根据RLP编码规则以太坊私钥生成过程,我们将tx字段按顺序编码为一个list(hash除外)。 由于长度必须大于55字节,所以使用最后一种编码方式。

暂且不考虑前两位,对所有项进行RLP编码,结果如下:

以太坊和以太经典未来哪个好_以太坊离线生成账号_以太坊私钥生成过程

结合起来就是:

一共214位,长度为107位,也就是说第二位是0x6b,第一位是0xf7+len(0x6b)=0xf8,这也是最终的原始内容:

1.2 keystore文件及其解密

keystore 文件用于存储以太坊私钥。 为了避免私钥明文存储造成的泄露,keystore文件应运而生。 下面结合keystore文件的内容来看看私钥是如何加密的:

以太坊私钥生成过程_以太坊和以太经典未来哪个好_以太坊离线生成账号

这里结合私钥的加密过程来解释各个字段的含义:

加密步骤一:使用aes-128-ctr加密以太坊账户私钥

开头提到,创建keystore文件是为了避免私钥明文存储造成的泄露,所以加密的第一步就是对以太坊账户的私钥进行加密。 这里使用aes-128-ctr方式进行加密。 设置好解密密钥和初始化向量iv后,就可以对以太坊账户的私钥进行加密,得到加密后的密文。

keystore文件中的cipher、cipherparams、ciphertext参数与本次加密步骤相关:

加密步骤2:使用kdf算法计算解密密钥

经过第一步加密后,以太坊账户的私钥已经成功加密。 我们只需要记住解密密钥就可以解密了,但是这里又出现了一个新的问题,解密密钥有32位那么长,完全没有规律可言。 所以以太坊使用密钥推导函数(kdf)来计算解密密钥。 在这个keystore文件中,根据kdf参数可以知道使用了scrypt算法。 最终效果是:将我们设置的密码和kdfparams中的参数进行scrypt计算,就会得到加密步骤1中设置的解密密钥。

keystore 文件中的 kdf 和 kdfparams 参数与这个加密步骤有关:

加密第三步:验证用户密码的正确性

假设用户输入了正确的密码,只有通过步骤1和2解密才能得到正确的私钥。但我们不能保证用户每次输入的密码都是正确的。 于是介绍了校验计算的操作。 检查的操作非常简单。 将第2步解密出的密钥的第17位到第32位与密文拼接,计算出该字符串的sha3_256值。 如果内容与mac相同,则密码正确。

keystore文件中的mac参数与这一步有关:

综上所述,从keystore文件中解密私钥,需要的步骤是:

流程图如下:

以太坊私钥生成过程_以太坊离线生成账号_以太坊和以太经典未来哪个好

1.3 以太坊交易流程

根据源代码和网上现有资料,以太坊的交易流程总结如下:

1. 用户发起转账请求。

2.以太坊签署转账信息

3. 验证签名信息并将信息添加到交易缓冲池(txpool)

4.从交易缓存池中提取交易信息进行广播

以太坊私钥生成过程_以太坊和以太经典未来哪个好_以太坊离线生成账号

对于本文,第 2 步:以太坊签署转账信息对于理解第 3.4 节利用离线漏洞非常重要。

由上可知,私钥已经在keystore文件中加密,所以在进行第2步的签名操作之前,需要对私钥进行解密。在以太坊的操作中,有专门的解锁账户的接口: personal.unlockAccount

解锁相应的账户后,我们就可以进行转账操作了。 在用私钥签名之前,有一些初始化操作:

这里要注意一件事:Transaction 结构中没有 from 字段。 这里不加from字段和后面的签名算法有密切关系。

使用私钥签署交易信息主要分为两步:

对构建的列表进行RLP编码,然后通过sha3_256计算编码后的字符串的哈希值。

由于以太坊的地址是去掉公钥第一位后经过sha3_256加密的后40位,所以即使交易信息中不包含from,我们仍然可以知道交易来自哪个地址。 这也是上面提到的Transaction结构中不存在from的原因。

签名完成后,会加入到交易缓冲池(txpool)中。 在这个操作中,from会被恢复,并进行一定的验证操作。 同时,也考虑了交易缓存池的各种极端情况,例如当交易缓存池满时,从缓存池中移除金额最小的交易。

最后,存储在交易缓存池中的交易将被广播,网络中的每个节点在收到交易后将交易存储在交易缓存池中。 当一个节点挖出一个新的区块时,它会根据 gasPrice 对交易缓存池中的交易进行排序,并将它们打包到区块中。

所谓磨刀不误砍柴工,就是只有清楚地掌握了重点知识点,才能游刃有余地理解后面的漏洞原理。