Passer au contenu principal

Définition du stockage secret Web3

Dernière modification: , Invalid DateTime

Pour que votre application fonctionne sur Ethereum, vous pouvez utiliser l'objet web3 fourni par la bibliothèque web3.js. Il communique à un nœud local par le biais des appels RPC. Web3(opens in a new tab) fonctionne avec n'importe quel nœud Ethereum qui propose une couche RPC.

web3 contient l'objet 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
Afficher tout
📋 Copier

Ce document est la version 3 de la Définition du Stockage Secret Web3.

Définition

L'encodage et le décodage du fichier restent en grande partie inchangés depuis la version 1, sauf que l'algorithme de cryptage n'est plus fixé à AES-128-CBC (AES-128-CTR est maintenant le minimum requis). La plupart des significations/algorithmes sont similaires à la version 1, sauf mac, qui est donné comme SHA3 (keccak-256) des concaténations des 16 octets les plus à gauche de la clé dérivée avec le cryptage complet.

Les fichiers de clés secrètes sont stockés directement dans ~/.web3/keystore (pour les systèmes Unix) et ~/AppData/Web3/keystore (pour Windows). Ils peuvent porter n'importe quel nom, mais une bonne convention est <uuid>. fils, où <uuid> est l'UUID 128 bits donné à la clé secrète (un proxy préservant la vie privée pour l'adresse de la clé secrète).

Tous ces fichiers ont un mot de passe associé. Pour dériver la clé secrète d'un fichier .json donné, il faut d'abord dériver la clé de chiffrement du fichier ; cela se fait en prenant le mot de passe du fichier et en le faisant passer par une fonction de dérivation de clés, comme décrit par la clé kdf. Les paramètres statiques et dynamiques de la fonction KDF sont décrits dans la clé kdfparams.

PBKDF2 doit cependant être pris en charge par toutes les implémentations minimalement conformes, désignées par :

  • kdf: pbkdf2

Pour PBKDF2, les kdfparams incluent :

  • prf: Doit être hmac-sha256 (peut être étendu dans le futur) ;
  • c: nombre d'itérations ;
  • sel: sel passé à PBKDF ;
  • dklen: longueur de la clé dérivée. Doit être >= 32.

Une fois que la clé du fichier a été dérivée, elle doit être vérifiée par la dérivation du MAC. Le MAC doit être calculé comme le hachage SHA3 (keccak-256) du tableau d'octets formé comme les concaténations des 16 octets les plus à gauche de la clé dérivée avec le contenu de la clé de texte de chiffrement , c'est-à-dire :

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

(où ++ est l'opérateur de concaténation)

Cette valeur doit être comparée au contenu de la clé mac ; si elles sont différentes, un mot de passe alternatif doit être demandé (ou l'opération annulée).

Une fois la clé du fichier vérifiée, le texte de chiffrement (le cryptage clé dans le fichier) peut être déchiffré à l'aide de l'algorithme de chiffrement symétrique spécifié par la clé de chiffrement et paramétré à travers la clé de chiffrement. Si la taille de la clé dérivée et la taille de la clé de l'algorithme ne correspondent pas, les octets zéro les plus à droite de la clé dérivée doivent être utilisés comme clé de l'algorithme.

Toutes les implémentations minimalement conformes doivent supporter l'algorithme AES-128-CTR, désigné par :

  • cipher: aes-128-ctr

Ce procédé de chiffrement prend les paramètres suivants, donnés comme clés de la clé des paramètres de chiffrement :

  • iv: vecteur d'initialisation 128 bits pour le chiffrement.

La clé de chiffrement est constituée des 16 octets les plus à gauche de la clé dérivée, c'est-à-dire DK[0..15]

La création/Le cryptage d'une clé secrète doit être essentiellement l'inverse de ces instructions. Assurez-vous que les uuuid, sel et iv sont réellement aléatoires.

En plus du champ version , qui devrait agir comme un identifiant "en dur" de la version, les implémentations peuvent également utiliser minorversion pour suivre les changements plus petits et sans rupture du format.

Test des vecteurs

Détails :

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

PBKDF2-SHA-256

Test du vecteur en utilisant AES-128-CTR et PBKDF2-SHA-256 :

Contenu du fichier ~/.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
Afficher tout
📋 Copier

Intermédiaire :

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

Scrypt

Test de vecteur en utilisant AES-128-CTR et Scrypt :

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
Afficher tout
📋 Copier

Intermédiaire :

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

Modifications de la Version 1

Cette version corrige plusieurs incohérences vis-à-vis de la version 1 publiée ici(opens in a new tab). En bref, il s'agit de :

  • La capitalisation est injustifiée et incohérente (Scrypt minuscule, Kdf mixte, Mac majuscule).
  • Adresse inutile et compromettant la vie privée.
  • Le sel est intrinsèquement un paramètre de la fonction de dérivation clé et mérite d'y être associé, et non à la crypto en général.
  • SaltLen inutile (il suffit de le déduire du sel).
  • La fonction de dérivation de clé est donnée, mais l'algorithme de crypto n'est pas spécifié.
  • La version est intrinsèquement numérique, mais il s'agit encore d'une chaîne de caractères (le contrôle structuré des versions serait possible avec une chaîne, mais peut être considéré hors de portée pour un format de fichier de configuration rarement changeant).
  • KDF et chiffrement sont en théorie des concepts frères mais sont organisés différemment.
  • MAC est calculé à travers un espace de données agnostique (!)

Des modifications ont été apportées au format pour donner le fichier suivant, équivalent sur le plan fonctionnel à l'exemple donné sur la page précédemment citée :

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
Afficher tout
📋 Copier

Modifications de la Version 2

La version 2 était une implémentation précoce C++ comportant un certain nombre d'anomalies. Tous les éléments essentiels restent inchangés.

Cet article vous a été utile ?