---
title: "Web3 सीक्रेट स्टोरेज परिभाषा"
description: "Web3 सीक्रेट स्टोरेज के लिए औपचारिक परिभाषा"
lang: hi
sidebarDepth: 2
---

अपने ऐप को इथेरियम पर काम करने लायक बनाने के लिए, आप Web3.js लाइब्रेरी द्वारा प्रदान किए गए web3 ऑब्जेक्ट का उपयोग कर सकते हैं। आंतरिक रूप से यह RPC कॉल के माध्यम से एक स्थानीय नोड से संचार करता है। [web3](https://github.com/ethereum/web3.js/) किसी भी इथेरियम नोड के साथ काम करता है जो RPC लेयर को एक्सपोज़ करता है।

`web3` में `eth` ऑब्जेक्ट - web3.eth शामिल है।

```js
var fs = require("fs")
var recognizer = require("ethereum-keyfile-recognizer")

fs.readFile("keyfile.json", (err, data) => {
  var json = JSON.parse(data)
  var result = recognizer(json)
})

/** परिणाम
 *               [ 'web3', 3 ]   Web3 (v3) कुंजीफ़ाइल
 *  [ 'ethersale', undefined ]   Ethersale कुंजीफ़ाइल
 *                        null     अमान्य कुंजीफ़ाइल
 */
```

यह Web3 सीक्रेट स्टोरेज परिभाषा के **संस्करण 3** का दस्तावेजीकरण करता है।

## परिभाषा {#definition}

फ़ाइल की वास्तविक एन्कोडिंग और डिकोडिंग काफी हद तक संस्करण 1 से अपरिवर्तित रहती है, सिवाय इसके कि क्रिप्टो एल्गोरिदम अब AES-128-CBC पर तय नहीं है (AES-128-CTR अब न्यूनतम आवश्यकता है)। अधिकांश अर्थ/एल्गोरिदम संस्करण 1 के समान हैं, सिवाय `mac` के, जिसे व्युत्पन्न कुंजी (derived key) के दूसरे-सबसे बाएँ 16 बाइट्स और पूर्ण `ciphertext` के संयोजन (concatenation) के SHA3 (केकाक-256) के रूप में दिया गया है।

सीक्रेट कुंजी फ़ाइलें सीधे `~/.web3/keystore` (Unix-जैसे सिस्टम के लिए) और `~/AppData/Web3/keystore` (Windows के लिए) में संग्रहीत की जाती हैं। उनका नाम कुछ भी रखा जा सकता है, लेकिन एक अच्छी परंपरा `<uuid>.json` है, जहाँ `<uuid>` सीक्रेट कुंजी को दिया गया 128-बिट UUID है (सीक्रेट कुंजी के पते के लिए एक गोपनीयता-संरक्षित प्रॉक्सी)।

ऐसी सभी फ़ाइलों से एक पासवर्ड जुड़ा होता है। किसी दिए गए `.json` फ़ाइल की सीक्रेट कुंजी प्राप्त करने के लिए, सबसे पहले फ़ाइल की एन्क्रिप्शन कुंजी प्राप्त करें; यह फ़ाइल का पासवर्ड लेकर और उसे `kdf` कुंजी द्वारा वर्णित कुंजी व्युत्पत्ति फ़ंक्शन (key derivation function) के माध्यम से पास करके किया जाता है। KDF फ़ंक्शन के लिए KDF-निर्भर स्थिर और गतिशील मापदंडों का वर्णन `kdfparams` कुंजी में किया गया है।

PBKDF2 को सभी न्यूनतम-अनुपालन वाले कार्यान्वयनों द्वारा समर्थित किया जाना चाहिए, जिसे इस प्रकार दर्शाया गया है:

- `kdf`: `pbkdf2`

PBKDF2 के लिए, kdfparams में शामिल हैं:

- `prf`: `hmac-sha256` होना चाहिए (भविष्य में विस्तारित किया जा सकता है);
- `c`: पुनरावृत्तियों (iterations) की संख्या;
- `salt`: PBKDF को पास किया गया सॉल्ट (salt);
- `dklen`: व्युत्पन्न कुंजी की लंबाई। >= 32 होनी चाहिए।

एक बार फ़ाइल की कुंजी प्राप्त हो जाने के बाद, इसे MAC की व्युत्पत्ति के माध्यम से सत्यापित किया जाना चाहिए। MAC की गणना व्युत्पन्न कुंजी के दूसरे-सबसे बाएँ 16 बाइट्स और `ciphertext` कुंजी की सामग्री के संयोजन से बने बाइट ऐरे के SHA3 (केकाक-256) हैश के रूप में की जानी चाहिए, अर्थात:

```js
KECCAK(DK[16..31] ++ <ciphertext>)
```

(जहाँ `++` संयोजन ऑपरेटर है)

इस मान की तुलना `mac` कुंजी की सामग्री से की जानी चाहिए; यदि वे भिन्न हैं, तो एक वैकल्पिक पासवर्ड का अनुरोध किया जाना चाहिए (या ऑपरेशन रद्द कर दिया जाना चाहिए)।

फ़ाइल की कुंजी सत्यापित होने के बाद, सिफर टेक्स्ट (फ़ाइल में `ciphertext` कुंजी) को `cipher` कुंजी द्वारा निर्दिष्ट और `cipherparams` कुंजी के माध्यम से पैरामीटराइज़ किए गए सममित एन्क्रिप्शन (symmetric encryption) एल्गोरिदम का उपयोग करके डिक्रिप्ट किया जा सकता है। यदि व्युत्पन्न कुंजी का आकार और एल्गोरिदम की कुंजी का आकार मेल नहीं खाता है, तो व्युत्पन्न कुंजी के शून्य-पैडेड (zero padded), सबसे दाएँ बाइट्स का उपयोग एल्गोरिदम की कुंजी के रूप में किया जाना चाहिए।

सभी न्यूनतम-अनुपालन वाले कार्यान्वयनों को AES-128-CTR एल्गोरिदम का समर्थन करना चाहिए, जिसे इस प्रकार दर्शाया गया है:

- `cipher: aes-128-ctr`

यह सिफर निम्नलिखित पैरामीटर लेता है, जिन्हें cipherparams कुंजी की कुंजियों के रूप में दिया जाता है:

- `iv`: सिफर के लिए 128-बिट इनिशियलाइज़ेशन वेक्टर।

सिफर के लिए कुंजी व्युत्पन्न कुंजी के सबसे बाएँ 16 बाइट्स है, अर्थात, `DK[0..15]`

सीक्रेट कुंजी का निर्माण/एन्क्रिप्शन अनिवार्य रूप से इन निर्देशों के विपरीत होना चाहिए। सुनिश्चित करें कि `uuid`, `salt` और `iv` वास्तव में यादृच्छिक (random) हैं।

`version` फ़ील्ड के अलावा, जिसे संस्करण के "हार्ड" पहचानकर्ता के रूप में कार्य करना चाहिए, कार्यान्वयन प्रारूप में छोटे, गैर-ब्रेकिंग परिवर्तनों को ट्रैक करने के लिए `minorversion` का भी उपयोग कर सकते हैं।

## टेस्ट वेक्टर्स {#test-vectors}

विवरण:

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

### PBKDF2-SHA-256 {#pbkdf2-sha-256}

`AES-128-CTR` और `PBKDF2-SHA-256` का उपयोग करके टेस्ट वेक्टर:

`~/.web3/keystore/3198bc9c-6672-5ab3-d9954942343ae5b6.json` की फ़ाइल सामग्री:

```json
{
  "crypto": {
    "cipher": "aes-128-ctr",
    "cipherparams": {
      "iv": "6087dab2f9fdbbfaddc31a909735c1e6"
    },
    "ciphertext": "5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46",
    "kdf": "pbkdf2",
    "kdfparams": {
      "c": 262144,
      "dklen": 32,
      "prf": "hmac-sha256",
      "salt": "ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd"
    },
    "mac": "517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2"
  },
  "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6",
  "version": 3
}
```

**मध्यवर्ती (Intermediates)**:

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

### Scrypt {#scrypt}

AES-128-CTR और Scrypt का उपयोग करके टेस्ट वेक्टर:

```json
{
  "crypto": {
    "cipher": "aes-128-ctr",
    "cipherparams": {
      "iv": "740770fce12ce862af21264dab25f1da"
    },
    "ciphertext": "dd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2",
    "kdf": "scrypt",
    "kdfparams": {
      "dklen": 32,
      "n": 262144,
      "p": 1,
      "r": 8,
      "salt": "25710c2ccd7c610b24d068af83b959b7a0e5f40641f0c82daeb1345766191034"
    },
    "mac": "337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c"
  },
  "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6",
  "version": 3
}
```

**मध्यवर्ती (Intermediates)**:

`Derived key`: `7446f59ecc301d2d79bc3302650d8a5cedc185ccbb4bf3ca1ebd2c163eaa6c2d`
`MAC Body`: `edc185ccbb4bf3ca1ebd2c163eaa6c2ddd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2`
`MAC`: `337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c`
`Cipher key`: `7446f59ecc301d2d79bc3302650d8a5c`

## संस्करण 1 से परिवर्तन {#alterations-from-v2}

यह संस्करण [यहाँ](https://github.com/ethereum/homestead-guide/blob/master/old-docs-for-reference/go-ethereum-wiki.rst/Passphrase-protected-key-store-spec.rst) प्रकाशित संस्करण 1 के साथ कई विसंगतियों को ठीक करता है। संक्षेप में ये हैं:

- कैपिटलाइज़ेशन अनुचित और असंगत है (scrypt लोअरकेस, Kdf मिक्स्ड-केस, MAC अपरकेस)।
- पता (Address) अनावश्यक है और गोपनीयता से समझौता करता है।
- `Salt` आंतरिक रूप से कुंजी व्युत्पत्ति फ़ंक्शन का एक पैरामीटर है और इसके साथ जुड़ा होना चाहिए, न कि सामान्य रूप से क्रिप्टो के साथ।
- _SaltLen_ अनावश्यक है (बस इसे Salt से प्राप्त करें)।
- कुंजी व्युत्पत्ति फ़ंक्शन दिया गया है, फिर भी क्रिप्टो एल्गोरिदम को हार्ड-कोड किया गया है।
- `Version` आंतरिक रूप से संख्यात्मक है फिर भी एक स्ट्रिंग है (एक स्ट्रिंग के साथ संरचित वर्ज़निंग संभव होगी, लेकिन शायद ही कभी बदलने वाले कॉन्फ़िगरेशन फ़ाइल प्रारूप के लिए इसे दायरे से बाहर माना जा सकता है)।
- `KDF` और `cipher` वैचारिक रूप से समान अवधारणाएँ हैं फिर भी अलग तरह से व्यवस्थित हैं।
- `MAC` की गणना डेटा के एक व्हाइटस्पेस एग्नोस्टिक टुकड़े के माध्यम से की जाती है(!)

निम्नलिखित फ़ाइल देने के लिए प्रारूप में परिवर्तन किए गए हैं, जो कार्यात्मक रूप से पहले लिंक किए गए पृष्ठ पर दिए गए उदाहरण के समतुल्य है:

```json
{
  "crypto": {
    "cipher": "aes-128-cbc",
    "ciphertext": "07533e172414bfa50e99dba4a0ce603f654ebfa1ff46277c3e0c577fdc87f6bb4e4fe16c5a94ce6ce14cfa069821ef9b",
    "cipherparams": {
      "iv": "16d67ba0ce5a339ff2f07951253e6ba8"
    },
    "kdf": "scrypt",
    "kdfparams": {
      "dklen": 32,
      "n": 262144,
      "p": 1,
      "r": 8,
      "salt": "06870e5e6a24e183a5c807bd1c43afd86d573f7db303ff4853d135cd0fd3fe91"
    },
    "mac": "8ccded24da2e99a11d48cda146f9cc8213eb423e2ea0d8427f41c3be414424dd",
    "version": 1
  },
  "id": "0498f19a-59db-4d54-ac95-33901b4f1870",
  "version": 2
}
```

## संस्करण 2 से परिवर्तन {#alterations-from-v2-2}

संस्करण 2 कई बग्स के साथ एक प्रारंभिक C++ कार्यान्वयन था। सभी आवश्यक चीजें इससे अपरिवर्तित रहती हैं।