メインコンテンツへスキップ

Web3シークレットストレージの定義

最終編集者: , Invalid DateTime

アプリをイーサリアムで動作させるために、web3.js ライブラリが提供する Web3 オブジェクトを使用できます。 これは、内部で RPC 呼び出しを介してローカルノードと通信します。 Web3(opens in a new tab)は、RPC レイヤーを公開しているイーサリアムノードと連携します。

web3には、ethオブジェクト「web3.eth」が含まれています。

1var fs = require("fs")
2var recognizer = require("ethereum-keyfile-recognizer")
3
4fs.readFile("keyfile.json", (err, data) => {
5 var json = JSON.parse(data)
6 var result = recognizer(json)
7})
8
9/** result
10 * [ 'web3', 3 ] web3 (v3) keyfile
11 * [ 'ethersale', undefined ] Ethersale keyfile
12 * null invalid keyfile
13 */
14
すべて表示
📋 コピー

このドキュメントは、バージョン 3の Web3 シークレットストレージの定義です。

定義

ファイルのエンコードとデコードは、暗号化アルゴリズムが AES-128-CBC に固定されなくなったことを除いて(AES-128-CTR が最小要件になりました)、実際にはバージョン 1 からほとんど変更されていません 。 ほとんどの意味またはアルゴリズムは、バージョン 1 と似ていますが、macを除きます。これは、完全なciphertextと共に導出鍵の左から 2 番目の 16 バイトを連結した SHA3 (keccak-256) として指定されます。

秘密鍵ファイルは、~/.web3/keystore (Unix のようなシステム環境)と ~/AppData/Web3/keystore (Windows 環境)に直接保存されます。 任意の名前を付けることができますが、適切な規則としては<uuid>.jsonとすることが望ましいです。ここで、<uuid>は、秘密鍵(秘密鍵のアドレスのプライバシーを保護するプロキシ)に付与された 128 ビットの UUID です。

これらのファイルはすべて、関連付けられたパスワードを持っています。 ある.jsonファイルの秘密鍵を導出するには、まずファイルの暗号化鍵を導出します。これはファイルのパスワードを取得し、それをkdf鍵で記述された鍵導出関数に渡すことによって行われます。 KDF 関数への KDF 依存の静的パラメータおよび動的パラメータは、kdfparams鍵に記述されています。

次に示される PBKDF2 は、最小限に準拠したすべての実装でサポートされている必要があります。

  • kdf: pbkdf2

PBKDF2 の場合、kdfparams は次を含みます。

  • prf: hmac-sha256でなければならない(将来的には拡張される場合ががある)
  • c: 反復回数
  • salt: PBKDF に渡されるソルト
  • dklen: 導出鍵の長さ (32 以上でなければならない)

ファイルの鍵が導出されたら、MAC の導出によってそれを検証する必要があります。 MAC は、ciphertext鍵の内容を持つ導出鍵の左から 2 番目の 16 バイトの連結として形成されたバイト配列の SHA3 (keccak-256) ハッシュとして計算されるべきです。 すなわち次のようになります。

1KECCAK(DK[16..31] ++ <ciphertext>)
2
📋 コピー

(「++」は、連結演算子)

この値は、mac鍵の内容と比較する必要があります。異なる場合は、別のパスワードを要求する必要があります(または、操作をキャンセルする必要があります) 。

ファイルの鍵が検証された後、暗号テキスト(ファイル内の ciphertext鍵)は、cipherキーで指定された対称暗号アルゴリズムを使用して復号化され、cipherparams鍵によってパラメータ化されます。 導出鍵のサイズとアルゴリズムの鍵のサイズが一致しない場合、ゼロが付け足され、導出鍵の右端のバイトをアルゴリズムのキーとして使用する必要があります。

最小限の準拠をしたすべての実装は、次に示される AES-128-CTR アルゴリズムをサポートする必要があります。

  • cipher: aes-128-ctr

この暗号は、cipherparams 鍵への鍵として与えられる次のパラメーターを取ります。

  • iv: 暗号の 128 ビット初期化ベクトル。

暗号鍵は、導出鍵の左端の 16 バイト、つまりDK[0..15]です。

秘密鍵の作成/暗号化は、本質的にはこれらの命令の逆であるべきです。 uuidsaltivが実際にランダムであることを確認してください。

バージョンの「ハード」識別子として機能する versionフィールドに加えて、実装ではminorversionを使用してフォーマットへのより小さな非破壊的な変更を追跡することもできます。

テストベクトル

詳細:

  • Address: 008aeeda4d805471df9b2a5b0f38a0c3bcba786b
  • ICAP: XE542A5PZHH8PYIZUBEJEO0MFWRAPPIL67
  • UUID: 3198bc9c-6672-5ab3-d9954942343ae5b6
  • Password: testpassword
  • Secret: 7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d

PBKDF2-SHA-256

AES-128-CTRおよびPBKDF2-SHA-256を使用したテストベクトル

~/.web3/keystore/3198bc9c-6672-5ab3-d9954942343ae5b6.jsonのファイル内容:

1{
2 "crypto": {
3 "cipher": "aes-128-ctr",
4 "cipherparams": {
5 "iv": "6087dab2f9fdbbfaddc31a909735c1e6"
6 },
7 "ciphertext": "5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46",
8 "kdf": "pbkdf2",
9 "kdfparams": {
10 "c": 262144,
11 "dklen": 32,
12 "prf": "hmac-sha256",
13 "salt": "ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd"
14 },
15 "mac": "517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2"
16 },
17 "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6",
18 "version": 3
19}
20
すべて表示
📋 コピー

中間体:

Derived key: f06d69cdc7da0faffb1008270bca38f5e31891a3a773950e6d0fea48a7188551 MAC Body: e31891a3a773950e6d0fea48a71885515318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46 MAC: 517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2 Cipher key: f06d69cdc7da0faffb1008270bca38f5

スクリプト

AES-128-CTR とスクリプトを使用したテストベクトル

1{
2 "crypto": {
3 "cipher": "aes-128-ctr",
4 "cipherparams": {
5 "iv": "83dbcc02d8ccb40e466191a123791e0e"
6 },
7 "ciphertext": "d172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c",
8 "kdf": "scrypt",
9 "kdfparams": {
10 "dklen": 32,
11 "n": 262144,
12 "p": 8,
13 "r": 1,
14 "salt": "ab0c7876052600dd703518d6fc3fe8984592145b591fc8fb5c6d43190334ba19"
15 },
16 "mac": "2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097"
17 },
18 "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6",
19 "version": 3
20}
21
すべて表示
📋 コピー

中間体:

Derived key: fac192ceb5fd772906bea3e118a69e8bbb5cc24229e20d8766fd298291bba6bd MAC Body: bb5cc24229e20d8766fd298291bba6bdd172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c MAC: 2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097 Cipher key: fac192ceb5fd772906bea3e118a69e8b

バージョン 1 からの変更点

このバージョンでは、こちら(opens in a new tab)に公開されているバージョン 1 のいくつかの矛盾点が解消されています。 簡単には次のとおりです。

  • 大文字の使用が正当化されていなく、一貫性がない(scrypt の小文字、Kdf の大文字と小文字の混合、MAC の大文字) 。
  • 不必要な対処とプライバシーの侵害。
  • Saltは、本質的に鍵導出関数のパラメーターであり、一般的な暗号ではなく、鍵導出関数のパラメーターに関連付ける方がふさわしい。
  • SaltLenが不要(Salt から導出) 。
  • 鍵導出関数が与えられているが、暗号アルゴリズムは厳密に指定されている。
  • Versionは、本質的には数値であるものの文字列(構造化されたバージョン管理は、文字列でできるが、ほとんど変更されない構成ファイル形式の範囲外と考えられる) 。
  • KDFcipherは、概念的には兄弟であるが、構造は異なる。
  • MACは、空白に無関係なデータ (!) によって計算される。

次のフォーマットのファイルを提供するように変更。以前リンクされいたページに示されている例と機能的に同等。

1{
2 "crypto": {
3 "cipher": "aes-128-cbc",
4 "ciphertext": "07533e172414bfa50e99dba4a0ce603f654ebfa1ff46277c3e0c577fdc87f6bb4e4fe16c5a94ce6ce14cfa069821ef9b",
5 "cipherparams": {
6 "iv": "16d67ba0ce5a339ff2f07951253e6ba8"
7 },
8 "kdf": "scrypt",
9 "kdfparams": {
10 "dklen": 32,
11 "n": 262144,
12 "p": 1,
13 "r": 8,
14 "salt": "06870e5e6a24e183a5c807bd1c43afd86d573f7db303ff4853d135cd0fd3fe91"
15 },
16 "mac": "8ccded24da2e99a11d48cda146f9cc8213eb423e2ea0d8427f41c3be414424dd",
17 "version": 1
18 },
19 "id": "0498f19a-59db-4d54-ac95-33901b4f1870",
20 "version": 2
21}
22
すべて表示
📋 コピー

バージョン 2 からの変更点

バージョン 2 は、初期の C++実装で多くのバグがありました。 すべての必須機能は、バージョン 2 から変更ありません。

この記事は役に立ちましたか?