مرکزی مواد پر جائیں
Change page

ویب 3 سیکرٹ اسٹوریج کی تعریف

صفحہ کی آخری اپ ڈیٹ: 21 اکتوبر، 2025

اپنی ایپ کو Ethereum پر کام کرنے کے قابل بنانے کے لیے، آپ web3.js لائبریری کے ذریعے فراہم کردہ web3 آبجیکٹ استعمال کر سکتے ہیں۔ اندرونی طور پر یہ RPC کالز کے ذریعے مقامی نوڈ سے رابطہ کرتا ہے۔ web3 (opens in a new tab) کسی بھی ایسے Ethereum نوڈ کے ساتھ کام کرتا ہے جو RPC لیئر کو ظاہر کرتا ہو۔

web3 میں 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 */
سب دکھائیں

یہ ویب 3 سیکرٹ اسٹوریج کی تعریف کے ورژن 3 کی دستاویز ہے۔

تعریف

فائل کی اصل انکوڈنگ اور ڈیکوڈنگ بڑی حد تک ورژن 1 سے غیر تبدیل شدہ ہے، سوائے اس کے کہ کرپٹو الگورتھم اب AES-128-CBC پر فکس نہیں ہے (اب AES-128-CTR کم از کم ضرورت ہے)۔ زیادہ تر معانی/الگورتھم ورژن 1 سے ملتے جلتے ہیں، سوائے mac کے، جو اخذ کردہ کلید کے بائیں جانب سے دوسرے 16 بائٹس اور مکمل ciphertext کے ملاپ کے SHA3 (keccak-256) کے طور پر دیا گیا ہے۔

سیکرٹ کلید کی فائلیں براہ راست ~/.web3/keystore (یونکس جیسے سسٹمز کے لیے) اور ~/AppData/Web3/keystore (ونڈوز کے لیے) میں محفوظ کی جاتی ہیں۔ ان کا نام کچھ بھی رکھا جا سکتا ہے، لیکن ایک اچھی روایت <uuid>.json ہے، جہاں <uuid> سیکرٹ کلید کو دیا گیا 128-بٹ UUID ہے (سیکرٹ کلید کے ایڈریس کے لیے پرائیویسی کو محفوظ رکھنے والی پراکسی)۔

ایسی تمام فائلوں کا ایک متعلقہ پاس ورڈ ہوتا ہے۔ کسی دی گئی .json فائل کی سیکرٹ کلید اخذ کرنے کے لیے، پہلے فائل کی انکرپشن کلید اخذ کریں؛ یہ فائل کا پاس ورڈ لے کر اور اسے kdf کلید کے ذریعے بیان کردہ کلید اخذ کرنے والے فنکشن (key derivation function) سے گزار کر کیا جاتا ہے۔ KDF فنکشن کے لیے KDF پر منحصر جامد اور متحرک پیرامیٹرز kdfparams کلید میں بیان کیے گئے ہیں۔

PBKDF2 کو تمام کم از کم مطابقت رکھنے والے نفاذات (implementations) کے ذریعے سپورٹ کیا جانا چاہیے، جسے اس طرح ظاہر کیا جاتا ہے:

  • kdf: pbkdf2

PBKDF2 کے لیے، kdfparams میں شامل ہیں:

  • prf: لازمی طور پر hmac-sha256 ہونا چاہیے (مستقبل میں اس میں توسیع کی جا سکتی ہے)؛
  • c: تکرار (iterations) کی تعداد؛
  • salt: PBKDF کو پاس کیا گیا سالٹ (salt)؛
  • dklen: اخذ کردہ کلید کی لمبائی۔ لازمی طور پر = 32 ہونی چاہیے۔

ایک بار جب فائل کی کلید اخذ کر لی جائے، تو اسے MAC کے اخذ کے ذریعے تصدیق کیا جانا چاہیے۔ MAC کا حساب بائٹ سرنی (byte array) کے SHA3 (keccak-256) ہیش کے طور پر کیا جانا چاہیے جو اخذ کردہ کلید کے بائیں جانب سے دوسرے 16 بائٹس اور ciphertext کلید کے مشمولات کے ملاپ سے بنتی ہے، یعنی:

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

(جہاں ++ کنکیٹینیشن (concatenation) آپریٹر ہے)

اس قدر (value) کا موازنہ mac کلید کے مشمولات سے کیا جانا چاہیے؛ اگر وہ مختلف ہیں، تو متبادل پاس ورڈ طلب کیا جانا چاہیے (یا آپریشن منسوخ کر دیا جائے)۔

فائل کی کلید کی تصدیق کے بعد، سائفر ٹیکسٹ (فائل میں ciphertext کلید) کو cipher کلید کے ذریعے متعین کردہ اور cipherparams کلید کے ذریعے پیرامیٹرائزڈ سمیٹرک انکرپشن الگورتھم کا استعمال کرتے ہوئے ڈیکرپٹ کیا جا سکتا ہے۔ اگر اخذ کردہ کلید کا سائز اور الگورتھم کی کلید کا سائز مماثل نہیں ہیں، تو اخذ کردہ کلید کے زیرو پیڈڈ (zero padded)، دائیں جانب کے بائٹس کو الگورتھم کی کلید کے طور پر استعمال کیا جانا چاہیے۔

تمام کم از کم مطابقت رکھنے والے نفاذات کو AES-128-CTR الگورتھم کو سپورٹ کرنا چاہیے، جسے اس طرح ظاہر کیا جاتا ہے:

  • cipher: aes-128-ctr

یہ سائفر درج ذیل پیرامیٹرز لیتا ہے، جو cipherparams کلید کی کلیدوں کے طور پر دیے گئے ہیں:

  • iv: سائفر کے لیے 128-بٹ انیشلائزیشن ویکٹر (initialisation vector)۔

سائفر کے لیے کلید اخذ کردہ کلید کے بائیں جانب کے 16 بائٹس ہیں، یعنی DK[0..15]

سیکرٹ کلید کی تخلیق/انکرپشن بنیادی طور پر ان ہدایات کے برعکس ہونی چاہیے۔ یقینی بنائیں کہ uuid، salt اور iv واقعی بے ترتیب (random) ہیں۔

version فیلڈ کے علاوہ، جسے ورژن کے "سخت" شناخت کنندہ کے طور پر کام کرنا چاہیے، نفاذات فارمیٹ میں چھوٹی، نان بریکنگ تبدیلیوں کو ٹریک کرنے کے لیے minorversion کا بھی استعمال کر سکتے ہیں۔

ٹیسٹ ویکٹرز

تفصیلات:

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

PBKDF2-SHA-256

AES-128-CTR اور PBKDF2-SHA-256 کا استعمال کرتے ہوئے ٹیسٹ ویکٹر:

~/.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}
سب دکھائیں

درمیانی مراحل (Intermediates):

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

Scrypt

AES-128-CTR اور Scrypt کا استعمال کرتے ہوئے ٹیسٹ ویکٹر:

1{
2 "crypto": {
3 "cipher": "aes-128-ctr",
4 "cipherparams": {
5 "iv": "740770fce12ce862af21264dab25f1da"
6 },
7 "ciphertext": "dd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2",
8 "kdf": "scrypt",
9 "kdfparams": {
10 "dklen": 32,
11 "n": 262144,
12 "p": 1,
13 "r": 8,
14 "salt": "25710c2ccd7c610b24d068af83b959b7a0e5f40641f0c82daeb1345766191034"
15 },
16 "mac": "337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c"
17 },
18 "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6",
19 "version": 3
20}
سب دکھائیں

درمیانی مراحل (Intermediates):

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

ورژن 1 سے تبدیلیاں

یہ ورژن یہاں (opens in a new tab) شائع شدہ ورژن 1 کے ساتھ کئی تضادات کو دور کرتا ہے۔ مختصراً یہ ہیں:

  • کیپیٹلائزیشن (Capitalisation) غیر منصفانہ اور متضاد ہے (scrypt چھوٹے حروف میں، Kdf ملے جلے حروف میں، MAC بڑے حروف میں)۔
  • ایڈریس غیر ضروری ہے اور پرائیویسی کو خطرے میں ڈالتا ہے۔
  • Salt بنیادی طور پر کلید اخذ کرنے والے فنکشن کا ایک پیرامیٹر ہے اور اسے عام طور پر کرپٹو کے بجائے اسی کے ساتھ منسلک ہونا چاہیے۔
  • SaltLen غیر ضروری ہے (اسے صرف Salt سے اخذ کریں)۔
  • کلید اخذ کرنے والا فنکشن دیا گیا ہے، پھر بھی کرپٹو الگورتھم سختی سے متعین کیا گیا ہے۔
  • Version بنیادی طور پر عددی (numeric) ہے پھر بھی ایک سٹرنگ (string) ہے (سٹرنگ کے ساتھ سٹرکچرڈ ورژننگ ممکن ہو سکتی ہے، لیکن اسے شاذ و نادر ہی تبدیل ہونے والے کنفیگریشن فائل فارمیٹ کے دائرہ کار سے باہر سمجھا جا سکتا ہے)۔
  • KDF اور cipher تصوراتی طور پر ہم مرتبہ (sibling) تصورات ہیں پھر بھی انہیں مختلف طریقے سے منظم کیا گیا ہے۔
  • MAC کا حساب وائٹ اسپیس (whitespace) سے آزاد ڈیٹا کے ایک ٹکڑے کے ذریعے کیا جاتا ہے(!)

درج ذیل فائل دینے کے لیے فارمیٹ میں تبدیلیاں کی گئی ہیں، جو فعال طور پر پہلے لنک کیے گئے صفحے پر دی گئی مثال کے مساوی ہے:

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}
سب دکھائیں

ورژن 2 سے تبدیلیاں

ورژن 2 ایک ابتدائی C++ نفاذ تھا جس میں کئی بگز (bugs) تھے۔ تمام ضروری چیزیں اس سے غیر تبدیل شدہ رہتی ہیں۔

کیا یہ مضمون مددگار تھا؟