Web3 రహస్య నిల్వ నిర్వచనం
మీ యాప్ ఎథీరియంపై పనిచేసేలా చేయడానికి, మీరు Web3.js లైబ్రరీ అందించే web3 ఆబ్జెక్ట్ను ఉపయోగించవచ్చు. అంతర్గతంగా ఇది RPC కాల్స్ ద్వారా స్థానిక నోడ్తో కమ్యూనికేట్ చేస్తుంది. web3 (opens in a new tab) అనేది RPC లేయర్ను బహిర్గతం చేసే ఏ ఎథీరియం నోడ్తోనైనా పనిచేస్తుంది.
web3 లో eth ఆబ్జెక్ట్ ఉంటుంది - web3.eth.
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 ని డాక్యుమెంట్ చేస్తుంది.
నిర్వచనం
ఫైల్ యొక్క అసలు ఎన్కోడింగ్ మరియు డీకోడింగ్ వెర్షన్ 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 లెక్కించబడాలి, అనగా:
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 ని కూడా ఉపయోగించవచ్చు.
టెస్ట్ వెక్టర్స్
వివరాలు:
Address:008aeeda4d805471df9b2a5b0f38a0c3bcba786bICAP:XE542A5PZHH8PYIZUBEJEO0MFWRAPPIL67UUID:3198bc9c-6672-5ab3-d9954942343ae5b6Password:testpasswordSecret:7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d
PBKDF2-SHA-256
AES-128-CTR మరియు PBKDF2-SHA-256 ఉపయోగించి టెస్ట్ వెక్టర్:
~/.web3/keystore/3198bc9c-6672-5ab3-d9954942343ae5b6.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
AES-128-CTR మరియు Scrypt ఉపయోగించి టెస్ట్ వెక్టర్:
{
"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 నుండి మార్పులు
ఈ వెర్షన్ ఇక్కడ (opens in a new tab) ప్రచురించబడిన వెర్షన్ 1 తో ఉన్న అనేక అసమానతలను పరిష్కరిస్తుంది. క్లుప్తంగా ఇవి:
- క్యాపిటలైజేషన్ అన్యాయమైనది మరియు అస్థిరమైనది (scrypt లోయర్కేస్, Kdf మిక్స్డ్-కేస్, MAC అప్పర్కేస్).
- చిరునామా అనవసరం మరియు గోప్యతకు భంగం కలిగిస్తుంది.
Saltఅనేది అంతర్గతంగా కీ డెరివేషన్ ఫంక్షన్ యొక్క పారామితి మరియు సాధారణంగా క్రిప్టోతో కాకుండా దానితో అనుబంధించబడటానికి అర్హమైనది.- SaltLen అనవసరం (దానిని సాల్ట్ నుండి డిరైవ్ చేయండి).
- కీ డెరివేషన్ ఫంక్షన్ ఇవ్వబడింది, అయినప్పటికీ క్రిప్టో అల్గారిథమ్ కఠినంగా పేర్కొనబడింది.
Versionఅనేది అంతర్గతంగా సంఖ్యాపరమైనది అయినప్పటికీ ఇది ఒక స్ట్రింగ్ (స్ట్రింగ్తో స్ట్రక్చర్డ్ వెర్షనింగ్ సాధ్యమవుతుంది, కానీ అరుదుగా మారే కాన్ఫిగరేషన్ ఫైల్ ఫార్మాట్ కోసం ఇది పరిధికి వెలుపల పరిగణించబడుతుంది).KDFమరియుcipherఅనేవి సంభావితంగా తోబుట్టువుల భావనలు అయినప్పటికీ భిన్నంగా నిర్వహించబడతాయి.MACఅనేది వైట్స్పేస్ అజ్ఞేయ డేటా ముక్క ద్వారా లెక్కించబడుతుంది(!)
గతంలో లింక్ చేయబడిన పేజీలో ఇచ్చిన ఉదాహరణకు క్రియాత్మకంగా సమానమైన కింది ఫైల్ను ఇవ్వడానికి ఫార్మాట్లో మార్పులు చేయబడ్డాయి:
{
"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 నుండి మార్పులు
వెర్షన్ 2 అనేది అనేక బగ్లతో కూడిన ప్రారంభ C++ ఇంప్లిమెంటేషన్. అన్ని ఆవశ్యకతలు దాని నుండి మారకుండా ఉంటాయి.