---
title: "⁦Web3⁩ ரகசிய சேமிப்பக வரையறை"
description: "⁦Web3⁩ ரகசிய சேமிப்பகத்திற்கான முறையான வரையறை"
lang: ta
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 என்பது குறைந்தபட்ச தேவையாகும்). பெறப்பட்ட திறவுகோலின் இடதுபுறத்திலிருந்து இரண்டாவது 16 பைட்டுகளையும் முழுமையான `ciphertext`-ஐயும் இணைத்து உருவாக்கப்படும் SHA3 (கெக்காக்-256) ஆக வழங்கப்படும் `mac`-ஐத் தவிர, பெரும்பாலான அர்த்தங்கள்/அல்காரிதம்கள் பதிப்பு 1-ஐப் போலவே உள்ளன.

ரகசிய திறவுகோல் கோப்புகள் நேரடியாக `~/.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`: மறுசெயல்களின் எண்ணிக்கை (number of iterations);
- `salt`: PBKDF-க்கு அனுப்பப்படும் சால்ட் (salt);
- `dklen`: பெறப்பட்ட திறவுகோலின் நீளம். >= 32 ஆக இருக்க வேண்டும்.

கோப்பின் திறவுகோல் பெறப்பட்டவுடன், அது MAC-ஐப் பெறுவதன் மூலம் சரிபார்க்கப்பட வேண்டும். பெறப்பட்ட திறவுகோலின் இடதுபுறத்திலிருந்து இரண்டாவது 16 பைட்டுகளையும் `ciphertext` திறவுகோலின் உள்ளடக்கங்களையும் இணைத்து உருவாக்கப்படும் பைட் வரிசையின் SHA3 (கெக்காக்-256) ஹாஷ் ஆக MAC கணக்கிடப்பட வேண்டும், அதாவது:

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

(இங்கு `++` என்பது இணைப்பு செயலி (concatenation operator) ஆகும்)

இந்த மதிப்பு `mac` திறவுகோலின் உள்ளடக்கங்களுடன் ஒப்பிடப்பட வேண்டும்; அவை வேறுபட்டால், மாற்று கடவுச்சொல் கோரப்பட வேண்டும் (அல்லது செயல்பாடு ரத்து செய்யப்பட வேண்டும்).

கோப்பின் திறவுகோல் சரிபார்க்கப்பட்ட பிறகு, `cipher` திறவுகோலால் குறிப்பிடப்பட்ட மற்றும் `cipherparams` திறவுகோல் மூலம் அளவுருவாக்கப்பட்ட சமச்சீர் குறியாக்க அல்காரிதத்தைப் பயன்படுத்தி மறைக்குறியீட்டு உரை (கோப்பில் உள்ள `ciphertext` திறவுகோல்) குறிவிலக்கப்படலாம். பெறப்பட்ட திறவுகோலின் அளவும் அல்காரிதத்தின் திறவுகோல் அளவும் பொருந்தவில்லை எனில், பெறப்பட்ட திறவுகோலின் வலதுபுறத்தில் உள்ள பூஜ்ஜியத்தால் நிரப்பப்பட்ட பைட்டுகள் அல்காரிதத்திற்கான திறவுகோலாகப் பயன்படுத்தப்பட வேண்டும்.

குறைந்தபட்ச இணக்கமான அனைத்து செயலாக்கங்களும் AES-128-CTR அல்காரிதத்தை ஆதரிக்க வேண்டும், இது பின்வருமாறு குறிக்கப்படுகிறது:

- `cipher: aes-128-ctr`

இந்த மறைக்குறியீடு பின்வரும் அளவுருக்களை எடுத்துக்கொள்கிறது, இவை cipherparams திறவுகோலுக்கான திறவுகோல்களாக வழங்கப்படுகின்றன:

- `iv`: மறைக்குறியீட்டிற்கான 128-பிட் துவக்க வெக்டார் (initialisation vector).

மறைக்குறியீட்டிற்கான திறவுகோல் என்பது பெறப்பட்ட திறவுகோலின் இடதுபுறத்தில் உள்ள 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 பெரிய எழுத்து).
- முகவரி தேவையற்றது மற்றும் தனியுரிமையை சமரசம் செய்கிறது.
- `Salt` என்பது இயல்பாகவே திறவுகோல் பெறுதல் சார்பின் ஒரு அளவுருவாகும், மேலும் இது பொதுவாக கிரிப்டோவுடன் அல்லாமல் அதனுடன் தொடர்புடையதாக இருக்க வேண்டும்.
- _SaltLen_ தேவையற்றது (அதை Salt-லிருந்து பெறலாம்).
- திறவுகோல் பெறுதல் சார்பு கொடுக்கப்பட்டுள்ளது, இருப்பினும் கிரிப்டோ அல்காரிதம் கடினமாக குறிப்பிடப்பட்டுள்ளது.
- `Version` என்பது இயல்பாகவே எண்ணியல் சார்ந்தது, ஆனால் இது ஒரு சரமாக (string) உள்ளது (ஒரு சரத்தைக் கொண்டு கட்டமைக்கப்பட்ட பதிப்பாக்கம் சாத்தியமாகும், ஆனால் அரிதாகவே மாறும் உள்ளமைவு கோப்பு வடிவமைப்பிற்கு இது நோக்கத்திற்கு அப்பாற்பட்டதாகக் கருதப்படலாம்).
- `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++ செயலாக்கமாகும். அதிலிருந்து அனைத்து அத்தியாவசிய கூறுகளும் மாறாமல் உள்ளன.