以太币(ETH)是以太坊(Ethereum)中的一种数字代币。和其他数字货币一样,以太币可以在交易平台上进行买卖。2013年年末,以太坊创始人VitalikButerin发布了以太坊初版白皮书,启动了项目。以太坊客户端的源代码地址参见:https://github.com/ethereum。目前有C++、Go等多个版本,在此针对Go版本进行介绍。

下载go-ethereum源代码:gitclone https://github.com/ethereum/go-ethereum.git。然后用makeall命令进行编译,完成后将在build/bin文件夹中生成如表2-1所示的可执行文件。

以太币安全属性分析

以太币安全属性分析

通常情况下,人们只想与以太坊网络进行交互——创建账户、转移资金、部署并与合约进行交互,很少关心历史数据,所以可以用以下命令快速地同步到网络的当前状态。

以太币安全属性分析

对于以太坊的开发者,在开发过程中往往希望创建以太坊智能合约时,并不需要支付真实的费用。在这种情况下,开发者不需要连接到主网络,而是通过节点连接到测试网络。测试网络的功能几乎与主网络完全相同,只是使用以太测试币。

以太币安全属性分析

其中,-testnet表明连接到测试网络,并创建文件夹~/.ethereum/testnet,测试网络的数据都会存放在这个文件夹中。对于新用户,需要先创建一个一个账号:

以太币安全属性分析

账号创建完成后,可以使用>eth.accounts来查看。创建账号的同时,会生成一个用于以太坊交易的密钥,存放在~/.ethereum/testnet/keystore中。这里的密钥在加密后进行存储,使用的加密算法是AES-128,而AES-128加密所用的密钥就是创建账号时用户输入的口令。备份密钥时,只需把keystore中的文件复制到目标文件夹中,同时还要备份创建账号时的口令。为了达到更高的安全性,建议把密钥备份到多个不同的地方,以便防范火灾、洪水、地震等风险。

冷存储可以提高密钥的安全性。在一台离线的计算机上生成以太币地址和私钥,由这台计算机生成的私钥永远不会在其他计算机或者网络上出现。以太币可以发到这个离线生成的地址上进行保存;使用这些以太币时,需要在离线计算机上签名。目前,以太坊官方go-ethereum钱包1.6版本还未实现离线签名功能,所以还不支持冷存储。可以使用其他工具进行冷存储,比如icebox工具(https://github.com/ConsenSys/icebox)。多重签名也有助于提高以太币的安全性。可惜我们在以太坊官方go-ethereum钱包1.6版本中没有发现生成多重签名的命令,但可在官方发布的Web浏览器Mist上生成多重签名的钱包合约。

以太币安全属性分析

以太坊中生成密钥时调用了Golang语言的rand包中的Reader,它是一个密码应用的伪随机生成器。在Linux系统中,当getrandom(2)可获取时,Reader就会调用这个函数,否则会调用/dev/urandom;在Windows系统中,Reader将使用CryptGenRandom接口。为了测试rand.Reader生成的随机数是否足够随机,我们用它生成了1200个长度为106的比特流,然后使用NISTSTS的随机数测试套件对这些比特流进行了测试。NISTSTS的随机数测试套件一共有15项测试:单比特频数检测、块内频数检测、累加和检测、游程检测、块内最大“1”游程检测、矩阵秩检测、离散傅里叶检测、非周期非周期模块匹配检测、重叠模块匹配检测、通用统计检测、近似熵检测、随机游动检测、随机游动变体检测、序列检测、线性复杂性检测。测试结果如图2-9所示。

以太币安全属性分析

由于分析结果很长,在此只截取了前后两部分内容。从图2-9中可以看出,绝大部分比特流都通过了测试,仅有很少的比特流没有通过。比如Serial测试中,在1200个样本中通过了1197个,而只要大于1177就说明这项测试通过。只有random excursion(variant)测试例外,只要在749个样本中,大于733个通过就行了。从整个分析报告可知,rand.Reader生成的随机数通过了NISTSTS的所有15项测试。所以,以太坊中的密钥是一个足够随机的数。需要指出的是,在Golang语言中还有一个math/rand包,虽然它也可以生成随机数,但是当生成密码学应用领域的随机数时,最好还是使用crypto/rand包,特别是密钥的生成。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注