Ethereum 钱包加密
为演示 AES 密码的实际应用,我们来看一个真实场景示例:Ethereum 区块链的标准加密钱包文件格式。我们将了解如何把 AES-128-CTR 密码与 Scrypt 和 MAC 结合,使用文本密码安全地实现认证对称密钥加密。
Ethereum UTC / JSON 钱包
在公共区块链网络(如 Bitcoin 和 Ethereum)中,区块链资产持有者的私钥存储在称为加密货币钱包的专用密钥库中。通常,这些加密货币钱包是本地硬盘上由密码加密的文件。
在 Ethereum 区块链中,加密货币钱包以一种特殊的加密格式存储,称为“UTC / JSON 钱包(密钥库文件)”或“Web3 秘密存储定义”。这是 geth 和 Parity(Ethereum 的主流协议实现)、MyEtherWallet(流行的在线客户端 Ethereum 钱包)、MetaMask(广泛使用的浏览器内 Ethereum 钱包)、ethers.js 和 Nethereum 库,以及许多其他 Ethereum 相关技术和工具所使用的钱包文件格式。
Ethereum UTC / JSON 密钥库以 JSON 文本文档形式保存加密私钥(或钱包助记词),其中指定了加密数据、加密算法及其参数。
UTC / JSON 密钥库——示例
来看一个示例 UTC / JSON 密钥库文件,其中保存了受密码保护的 256 位私钥。
{
"version": 3,
"id": "07a9f767-93c5-4842-9afd-b3b083659f04",
"address": "aef8cad64d29fcc4ed07629b9e896ebc3160a8d0",
"Crypto": {
"ciphertext": "99d0e66c67941a08690e48222a58843ef2481e110969325db7ff5284cd3d3093",
"cipherparams": { "iv": "7d7fabf8dee2e77f0d7e3ff3b965fc23" },
"cipher": "aes-128-ctr",
"kdf": "scrypt",
"kdfparams": {
"dklen": 32,
"salt": "85ad073989d461c72358ccaea3551f7ecb8e672503cb05c2ee80cfb6b922f4d4",
"n": 8192,
"r": 8,
"p": 1
},
"mac": "06dcf1cc4bffe1616fafe94a2a7087fd79df444756bb17c93af588c3ab02a913"
}
}
上述 JSON 文档是认证对称加密的经典示例。
UTC / JSON 文件中有什么?
UTC / JSON 密钥库通常包含以下数据:
- 密钥派生函数(KDF),用于把文本形式的钱包加密密码转换为 AES 对称密钥,以加密钱包内容。KDF 函数通常为“scrypt”。
- KDF 参数——KDF 函数从密码派生密钥时使用的参数(如迭代次数、盐等)
- 密文——加密后的钱包内容(通常包含一个加密的 256 位私钥)。
- 对称密码算法及其参数,例如 AES-128-CTR + 初始化向量(IV)。
- MAC——消息认证码,用于在消息解密后检查其完整性(从而判断钱包解密密码是否正确)。
- Ethereum 的 MAC 计算方式是:将派生密钥从左侧数第二组 16 字节与完整密文拼接,再计算其 keccak-256 哈希。
- 其他元数据:钱包格式版本、钱包唯一 id(uuid),以及该钱包控制的区块链地址。
默认的密钥派生函数为 scrypt,并使用较弱的 scrypt 参数(n=8192 成本因子、r=8 分组大小、p=1 并行度),因此建议使用长而复杂的密码,避免钱包遭受暴力解密攻击。
MyEtherWallet:试用 UTC / JSON 密钥库文件
要更好地了解 Ethereum UTC / JSON 密钥库文件背后的文件格式,可以试用 MyEtherWallet。

按照以下步骤创建一个新的随机 Ethereum 加密货币钱包,并查看其加密 JSON 内容:
- 打开 MyEtherWallet 网站:https://myetherwallet.com。
- 选择一个密码并创建新钱包。
- 下载密钥库文件(UTC / JSON)。
- 查看下载文件的内部内容。
- 尝试进行一些修改,例如使用错误密码解密或做其他更改。
- 享受动手学习的过程。