主页 > imtoken钱包如何解除授权 > 【HD-New Wallet】-keystore参数详解

【HD-New Wallet】-keystore参数详解

imtoken钱包如何解除授权 2023-03-04 07:05:00

冷钱包常用的地址导入备份方式有三种:keystore、私钥、mnemonicv。 不同的钱包有不同的侧重点。

Keystore 是一种块密码,它使用加密哈希函数来加密或解密您的以太坊帐户的私钥。 这是在你生成私钥之后完成的,用于加密私钥(也就是说,你必须提供密码和这个文件,而不仅仅是私钥)

所以说,光备份了Keystore但忘记了钱包密码也是无用的。
就像之前提到的,一个以太坊账户就是用于加密签署交易的一个私钥—公钥对。
为了确保你的私钥没有在文件中明文存储(即任何人只要能得到这个文件就能读),
使用强对称算法(cipher)对其加密至关重要。

imtoken中创建的钱包生成的keystore文件示例:

{
"version":3,
"id":"d57df606-1b86-447a-a60e-18a539f9d92e",
"address":"dd750189c1d4b984dd09c6cb1872577876cda740"

比特币扩展公钥_比特币私钥推算公钥_马斯克叫停比特币买车 比特币跳水

"crypto":{ //私钥加密 "cipher":”aes-128-ctr”, "cipherparams":{"iv":"262497534d19d7ea4a3998db620871d1”}, //密文 "ciphertext":"18393e50d7ee3e95ab9c2e96dc1af14a42c4aad07c722292811c650229cb0c06”, //通过密码解密密钥 "kdf":"scrypt”, "kdfparams" { "dklen":32, "r":8, "salt":"816c5b4b063aead329b043be0c2e2996e08a48af8bd392c32bc9d68786e6ced4",

马斯克叫停比特币买车 比特币跳水_比特币扩展公钥_比特币私钥推算公钥

"p":1, "n":262144 }, "mac":"84ab5797ba8a87e8e6edd98360368077387ee1e01671bdaef517caf14b059837”, }, }

详细参数说明:

version - 版本号

地址 - 是加密的公钥,以明文形式显示

id - 随机

加密包含参数:

比特币私钥推算公钥_马斯克叫停比特币买车 比特币跳水_比特币扩展公钥

初始化矢量(**IV**)是AES-128-CBC密码中使用的每个备份的16字节唯一字符串。它来源于加密密钥和实际的元数据明文。
-  EK是加密后的私钥
-  加密密钥(**EK**)是AES-128-CBC算法和PKCS7填充的16字节加密密钥。它被定义如下:
           EK = HMAC-SHA256(key: BackupKey, data: "Encryption Key")[0, 16]
-  iv是加密后的EK

以太坊使用了一个密钥生成函数,可以通过输入密码和一系列参数计算出解密密钥。这就是kdf和kdfparams的作用

而不是仅仅去:
                  `password -> hashed password`
它走了:
                 `password -> (MATH * 262144) -> hashed password.`

马斯克叫停比特币买车 比特币跳水_比特币私钥推算公钥_比特币扩展公钥

验证密码过程:

1. 用户输入密码`password`+`salt`+`n`+`R`+`p`+`dklen`进行`scrypt`加密,得出`derivedkey`
2. `derivedkey`+`iv`+`私钥`进行`aes128`加密得出`ciphertext`,长度为 64 位
3. `derivedkey` +`ciphertext`(加密的私钥)进行`sha3-256`加密得出`Mac`,长度为 64 位
// 通过1+3来判断用户的密码是否输入正确。

简单来说,dklen、n、r、p和salt就是kdf函数的参数。

dklen: 32, - 以字节为单位的派生密钥长度。 对于某些密码设置,这必须与那些块大小相匹配。

n: 262144, - 迭代次数。 geth 的默认值是 262144。因为浏览器不喜欢做 262,144 次的事情,MEW 被降低了。 基本上,这是来自上面数字的 (MATH * 262144)。

r : 8, - 底层哈希的块大小。 默认值为 8。

p: 1 - 并行化因子。 默认为 1。基本上比特币扩展公钥,您必须转到 0...1...2...262143...262144 或 262144...262143...2...1...0,您可以他们不能并行运行。 如果你把它改成 2AES,我不知道它是否改变了什么。 我不认为它真的像第 2 轮的哈希那样是第 1 轮的哈希,后者是第 0 轮的哈希。

salt - kdf 的随机盐。 大小必须满足 KDF(Key Derivation Function)要求。 如果未提供,则通过 crypto.getRandomBytes 生成随机数。

马斯克叫停比特币买车 比特币跳水_比特币私钥推算公钥_比特币扩展公钥

/*
如果我只能CPU破解,我可以减少/覆盖我的scrypt设置为1024 * 8 * 1,所以我可以GPU破解它?
不可以。更改  N  将改变迭代计数,这将改变散列。如果您减少数字以使您认为自己是#winning,Hashcat将会大大加速,但即使您的字典中包含明文,它也不会破解散列。
*/
//步骤1:(128 * 8)* 262144 = 1024 * 262144 = 268,435,456字节= 256MB
//步骤2:64(AMD卡)* 64([RX Vega 64具有64个CU]
//         (https://www.techpowerup.com/gpudb/2871/radeon-rx-vega-64))= 4,096个并行计算
//步骤3:256MB * 4,096 = 1,048,576 MB RAM = **Vega 64需要1,024 GB RAM**

keystore流程图如下:

比特币扩展公钥_马斯克叫停比特币买车 比特币跳水_比特币私钥推算公钥

密钥库文件生成流程图

Merkle Root 是从密文构建的 Merkle 树的 32 字节根。 为简单起见,我们使用与比特币块中使用的相同的默克尔树。 由于这棵 merkle 树容易发生变异(如果最后一个节点是奇数,可以在不更改根哈希的情况下复制它),客户端将需要重新计算和验证 IV 值,因为它们也充当明文 MAC。 密文被解释为使用 Hash256 散列,这是一个 1024 字节块的列表。 密文的最终区块长度 根据比特币 Merkle 树规范,如果任何中间元素列表(块或哈希)是奇数,则将复制最后一个元素。 如果整个密文长度小于或等于1024字节比特币扩展公钥,那么它的Hash256就是一个默克尔根。

参考链接: