---
title: "Web3 రహస్య నిల్వ నిర్వచనం"
description: "Web3 రహస్య నిల్వ కోసం అధికారిక నిర్వచనం"
lang: te
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 కనీస అవసరం). `mac` మినహా, చాలా అర్థాలు/అల్గారిథమ్‌లు వెర్షన్ 1 కి సమానంగా ఉంటాయి, ఇది డిరైవ్ చేయబడిన కీ యొక్క ఎడమవైపు నుండి రెండవ 16 బైట్‌లు మరియు పూర్తి `ciphertext` యొక్క కలయికల SHA3 (కేకాక్-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 యొక్క డెరివేషన్ ద్వారా ధృవీకరించబడాలి. డిరైవ్ చేయబడిన కీ యొక్క ఎడమవైపు నుండి రెండవ 16 బైట్‌లను `ciphertext` కీ కంటెంట్‌లతో కలపడం ద్వారా ఏర్పడిన బైట్ అర్రే యొక్క SHA3 (కేకాక్-256) హాష్‌గా MAC లెక్కించబడాలి, అనగా:

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

(ఇక్కడ `++` అనేది కంకాటెనేషన్ ఆపరేటర్)

ఈ విలువను `mac` కీ కంటెంట్‌లతో పోల్చాలి; అవి భిన్నంగా ఉంటే, ప్రత్యామ్నాయ పాస్‌వర్డ్‌ను అభ్యర్థించాలి (లేదా ఆపరేషన్ రద్దు చేయబడాలి).

ఫైల్ యొక్క కీ ధృవీకరించబడిన తర్వాత, `cipher` కీ ద్వారా పేర్కొనబడిన మరియు `cipherparams` కీ ద్వారా పారామీటరైజ్ చేయబడిన సిమెట్రిక్ ఎన్‌క్రిప్షన్ అల్గారిథమ్‌ని ఉపయోగించి సైఫర్ టెక్స్ట్ (ఫైల్‌లోని `ciphertext` కీ) డీక్రిప్ట్ చేయబడవచ్చు. డిరైవ్ చేయబడిన కీ పరిమాణం మరియు అల్గారిథమ్ యొక్క కీ పరిమాణం సరిపోలకపోతే, డిరైవ్ చేయబడిన కీ యొక్క సున్నా ప్యాడ్ చేయబడిన, కుడివైపున ఉన్న బైట్‌లను అల్గారిథమ్‌కు కీగా ఉపయోగించాలి.

కనీస-అనుకూలమైన అన్ని ఇంప్లిమెంటేషన్‌లు తప్పనిసరిగా AES-128-CTR అల్గారిథమ్‌కు మద్దతు ఇవ్వాలి, దీని ద్వారా సూచించబడుతుంది:

- `cipher: aes-128-ctr`

ఈ సైఫర్ కింది పారామితులను తీసుకుంటుంది, ఇవి cipherparams కీకి కీలుగా ఇవ్వబడతాయి:

- `iv`: సైఫర్ కోసం 128-బిట్ ఇనిషియలైజేషన్ వెక్టర్.

సైఫర్ కోసం కీ అనేది డిరైవ్ చేయబడిన కీ యొక్క ఎడమవైపున ఉన్న 16 బైట్‌లు, అనగా, `DK[0..15]`

రహస్య కీ యొక్క సృష్టి/ఎన్‌క్రిప్షన్ ప్రాథమికంగా ఈ సూచనలకు విరుద్ధంగా ఉండాలి. `uuid`, `salt` మరియు `iv` నిజంగా యాదృచ్ఛికంగా ఉన్నాయని నిర్ధారించుకోండి.

వెర్షన్ యొక్క "హార్డ్" ఐడెంటిఫైయర్‌గా పనిచేసే `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
}
```

**ఇంటర్మీడియట్స్**:

`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
}
```

**ఇంటర్మీడియట్స్**:

`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 అప్పర్‌కేస్).
- చిరునామా అనవసరం మరియు గోప్యతకు భంగం కలిగిస్తుంది.
- `Salt` అనేది అంతర్గతంగా కీ డెరివేషన్ ఫంక్షన్ యొక్క పారామితి మరియు సాధారణంగా క్రిప్టోతో కాకుండా దానితో అనుబంధించబడటానికి అర్హమైనది.
- _SaltLen_ అనవసరం (దానిని సాల్ట్ నుండి డిరైవ్ చేయండి).
- కీ డెరివేషన్ ఫంక్షన్ ఇవ్వబడింది, అయినప్పటికీ క్రిప్టో అల్గారిథమ్ కఠినంగా పేర్కొనబడింది.
- `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++ ఇంప్లిమెంటేషన్. అన్ని ఆవశ్యకతలు దాని నుండి మారకుండా ఉంటాయి.