ERC-2386: Ethereum 2 分层确定性钱包存储
Authors | Jim McDonald <Jim@mcdee.net> |
---|---|
Created | 2019-11-21 |
Discussion Link | https://ethereum-magicians.org/t/eip-2386-walletstore/3792 |
Requires | EIP-2334, EIP-2335 |
简述
用于存储和检索 Ethereum 2 分层确定性 (HD) 钱包定义的 JSON 格式。
摘要
以太坊具有密钥存储的概念:定义密钥的数据片段(有关详细信息,请参见 EIP-2335)。这增加了钱包存储的概念:定义钱包以及如何在所述钱包中创建密钥的存储。
动机
分层确定性钱包从_种子_和_路径_创建密钥。 需要访问种子来创建新密钥,但是也应像保护私钥一样保护它,以防止其成为容易攻击的媒介。 需要存储路径(或至少是路径的可变部分),以确保密钥不会重复。 提供一种执行此操作的标准方法可以促进钱包和类似软件之间的互操作性。
鉴于钱包具有大量在访问现有密钥和创建新密钥时有用的数据和元数据,因此,对这些信息及其存储方式进行标准化,可以使它在不同的钱包提供商之间轻松移植。
规范
分层确定性钱包存储的元素如下:
UUID
钱包存储中提供的 uuid
是一个随机生成的 type 4 UUID,如 RFC 4122 中所指定。 它旨在用作引用特定钱包的 128 位代理,用于唯一标识钱包。
必须存在此元素。 它必须是遵循 RFC 4122 第 3 节 中规定的句法结构的字符串。
名称
钱包存储中提供的 name
是一个 UTF-8 字符串。 它旨在用作用户友好的访问器。 对名称的唯一限制是它不能以下划线 (_
) 字符开头。
必须存在此元素。 它必须是一个字符串。
版本
提供的 version
是钱包存储的版本。
必须存在此元素。 它必须是整数 1
。
类型
提供的 type
是钱包的类型。 这会通知密钥生成之类的机制。
必须存在此元素。 它必须是字符串 hierarchical deterministic
。
密码学
提供的 crypto
是需要此信息的钱包的密钥的安全存储。 对于分层确定性钱包,这是它们从中计算各个私钥的种子。
必须存在此元素。 它必须是遵循 EIP-2335 中描述的定义的对象。
下一个帐户
提供的 nextaccount
是从种子创建新的私钥时要提供给路径 m/12381/60/<index>/0
的索引。 该路径遵循 EIP-2334。
如果钱包类型需要,则必须存在此元素。 它必须是一个非负整数。
JSON 模式
钱包存储的格式与 EIP-2335 中描述的密钥存储的格式相似。
{
"$ref": "#/definitions/Walletstore",
"definitions": {
"Walletstore": {
"type": "object",
"properties": {
"crypto": {
"type": "object",
"properties": {
"kdf": {
"$ref": "#/definitions/Module"
},
"checksum": {
"$ref": "#/definitions/Module"
},
"cipher": {
"$ref": "#/definitions/Module"
}
}
},
"name": {
"type": "string"
},
"nextaccount": {
"type": "integer"
},
"type": {
"type": "string"
},
"uuid": {
"type": "string",
"format": "uuid"
},
"version": {
"type": "integer"
}
},
"required": [
"name",
"type",
"uuid",
"version"
"crypto"
"nextaccount"
],
"title": "Walletstore"
},
"Module": {
"type": "object",
"properties": {
"function": {
"type": "string"
},
"params": {
"type": "object"
},
"message": {
"type": "string"
}
},
"required": [
"function",
"message",
"params"
]
}
}
}
理由
类似于密钥存储的标准钱包存储标准,提供了更高的钱包兼容性,并允许在它们之间进行更简单的钱包和密钥互换。
测试用例
测试向量
密码 'testpassword'
种子 0x147addc7ec981eb2715a22603813271cce540e0b7f577126011eb06249d9227c
{
"crypto": {
"checksum": {
"function": "sha256",
"message": "8bdadea203eeaf8f23c96137af176ded4b098773410634727bd81c4e8f7f1021",
"params": {}
},
"cipher": {
"function": "aes-128-ctr",
"message": "7f8211b88dfb8694bac7de3fa32f5f84d0a30f15563358133cda3b287e0f3f4a",
"params": {
"iv": "9476702ab99beff3e8012eff49ffb60d"
}
},
"kdf": {
"function": "pbkdf2",
"message": "",
"params": {
"c": 16,
"dklen": 32,
"prf": "hmac-sha256",
"salt": "dd35b0c08ebb672fe18832120a55cb8098f428306bf5820f5486b514f61eb712"
}
}
},
"name": "Test wallet 2",
"nextaccount": 0,
"type": "hierarchical deterministic",
"uuid": "b74559b8-ed56-4841-b25c-dba1b7c9d9d5",
"version": 1
}
实现
可以在 https://github.com/wealdtech/go-eth2-wallet-hd 找到分层确定性钱包的 Go 实现。
安全注意事项
存储在钱包 crypto
部分中的种子可用于生成沿派生路径的任何密钥。 这样,无论用于保护单个密钥存储的密码短语的安全性如何,HD 钱包生成的所有密钥的安全性都降低到密码短语的安全性以及用于保护种子的加密强度。
可以仅使用钱包存储以及每个密钥的索引,在这种情况下,可以使用更强的密码短语,因为解密只需要进行一次。 也可以使用生成的密钥存储而无需钱包存储,在这种情况下,安全漏洞只会暴露该密钥存储。
一个高安全性配置示例可能涉及离线计算机上存在的钱包存储,密钥存储是从该计算机生成的。 然后可以将密钥存储单独移动到在线计算机以用于签名。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Jim McDonald <Jim@mcdee.net>, "ERC-2386: Ethereum 2 分层确定性钱包存储 [DRAFT]," Ethereum Improvement Proposals, no. 2386, November 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2386.