মূল কন্টেন্টে যান
Change page

ওয়েব3 সিক্রেট স্টোরেজ সংজ্ঞা

পেজ সর্বশেষ আপডেট: 21 অক্টোবর, 2025

ইথিরিয়ামে আপনার অ্যাপ কাজ করানোর জন্য, আপনি web3.js লাইব্রেরি দ্বারা প্রদত্ত ওয়েব3 অবজেক্ট ব্যবহার করতে পারেন। এর ভেতরে এটি RPC কলের মাধ্যমে একটি লোকাল নোড এর সাথে যোগাযোগ করে। ওয়েব3 (opens in a new tab) যেকোনো ইথিরিয়াম নোড এর সাথে কাজ করে যা একটি 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/* * ফলাফল
10 * [ 'web3', 3 ] web3 (v3) কিফাইল
11 * [ 'ethersale', undefined ] Ethersale কিফাইল
12 * null অবৈধ কিফাইল */

এটি ওয়েব3 সিক্রেট স্টোরেজ সংজ্ঞার সংস্করণ 3 এর ডকুমেন্ট।

সংজ্ঞা

ফাইলের আসল এনকোডিং এবং ডিকোডিং সংস্করণ 1 থেকে অনেকাংশে অপরিবর্তিত রয়েছে, শুধুমাত্র ক্রিপ্টো অ্যালগরিদম আর AES-128-CBC তে নির্দিষ্ট নেই (AES-128-CTR এখন ন্যূনতম প্রয়োজনীয়তা)। বেশিরভাগ অর্থ/অ্যালগরিদম সংস্করণ 1 এর মতোই, শুধুমাত্র mac বাদে, যা ডিরাইভড কি (derived key) এর বাম দিক থেকে দ্বিতীয় 16 বাইট এবং সম্পূর্ণ ciphertext এর কনক্যাটেনেশনের SHA3 (keccak-256) হিসেবে দেওয়া হয়।

সিক্রেট কি (Secret key) ফাইলগুলো সরাসরি ~/.web3/keystore (ইউনিক্স-সদৃশ সিস্টেমের জন্য) এবং ~/AppData/Web3/keystore (উইন্ডোজের জন্য) এ সংরক্ষণ করা হয়। এগুলোর যেকোনো নাম দেওয়া যেতে পারে, তবে একটি ভালো নিয়ম হলো <uuid>.json, যেখানে <uuid> হলো সিক্রেট কি-কে দেওয়া 128-বিট UUID (সিক্রেট কি-এর এডড্রেস এর জন্য একটি গোপনীয়তা-রক্ষাকারী প্রক্সি)।

এই ধরনের সব ফাইলের সাথে একটি পাসওয়ার্ড যুক্ত থাকে। কোনো নির্দিষ্ট .json ফাইলের সিক্রেট কি ডিরাইভ করতে, প্রথমে ফাইলের এনক্রিপশন কি ডিরাইভ করুন; এটি ফাইলের পাসওয়ার্ড নিয়ে এবং kdf কি দ্বারা বর্ণিত একটি কি ডিরাইভেশন ফাংশনের মাধ্যমে পাস করে করা হয়। KDF ফাংশনের জন্য KDF-নির্ভর স্ট্যাটিক এবং ডাইনামিক প্যারামিটারগুলো kdfparams কি-তে বর্ণনা করা হয়েছে।

PBKDF2 অবশ্যই সমস্ত ন্যূনতম-কমপ্লায়েন্ট ইমপ্লিমেন্টেশন দ্বারা সমর্থিত হতে হবে, যা এভাবে নির্দেশিত হয়:

  • kdf: pbkdf2

PBKDF2 এর জন্য, kdfparams এর মধ্যে রয়েছে:

  • prf: অবশ্যই hmac-sha256 হতে হবে (ভবিষ্যতে বাড়ানো হতে পারে);
  • c: ইটারেশনের সংখ্যা;
  • salt: PBKDF এ পাস করা সল্ট;
  • dklen: ডিরাইভড কি-এর দৈর্ঘ্য। অবশ্যই >= 32 হতে হবে।

একবার ফাইলের কি ডিরাইভ করা হয়ে গেলে, এটি MAC ডিরাইভেশনের মাধ্যমে যাচাই করা উচিত। MAC কে ডিরাইভড কি-এর বাম দিক থেকে দ্বিতীয় 16 বাইট এবং ciphertext কি-এর কন্টেন্টের কনক্যাটেনেশন হিসেবে গঠিত বাইট অ্যারের SHA3 (keccak-256) হ্যাস হিসেবে গণনা করা উচিত, অর্থাৎ:

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

(যেখানে ++ হলো কনক্যাটেনেশন অপারেটর)

এই মানটিকে mac কি-এর কন্টেন্টের সাথে তুলনা করা উচিত; যদি সেগুলো আলাদা হয়, তবে একটি বিকল্প পাসওয়ার্ড চাওয়া উচিত (বা অপারেশনটি বাতিল করা উচিত)।

ফাইলের কি যাচাই করার পর, সাইফার টেক্সট (ফাইলে থাকা ciphertext কি) cipher কি দ্বারা নির্দিষ্ট করা এবং cipherparams কি-এর মাধ্যমে প্যারামিটারাইজ করা সিমেট্রিক এনক্রিপশন অ্যালগরিদম ব্যবহার করে ডিক্রিপ্ট করা যেতে পারে। যদি ডিরাইভড কি-এর আকার এবং অ্যালগরিদমের কি-এর আকার না মেলে, তবে ডিরাইভড কি-এর জিরো প্যাডেড, ডানদিকের বাইটগুলোকে অ্যালগরিদমের কি হিসেবে ব্যবহার করা উচিত।

সমস্ত ন্যূনতম-কমপ্লায়েন্ট ইমপ্লিমেন্টেশনকে অবশ্যই AES-128-CTR অ্যালগরিদম সমর্থন করতে হবে, যা এভাবে নির্দেশিত হয়:

  • cipher: aes-128-ctr

এই সাইফারটি নিচের প্যারামিটারগুলো নেয়, যা cipherparams কি-এর কি হিসেবে দেওয়া হয়:

  • iv: সাইফারের জন্য 128-বিট ইনিশিয়ালাইজেশন ভেক্টর।

সাইফারের জন্য কি হলো ডিরাইভড কি-এর বামদিকের 16 বাইট, অর্থাৎ, DK[0..15]

একটি সিক্রেট কি তৈরি/এনক্রিপশন মূলত এই নির্দেশাবলীর বিপরীত হওয়া উচিত। নিশ্চিত করুন যে uuid, salt এবং iv আসলেই র‍্যান্ডম।

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}

ইন্টারমিডিয়েটস:

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}

ইন্টারমিডিয়েটস:

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

সংস্করণ 1 থেকে পরিবর্তনসমূহ

এই সংস্করণটি এখানে (opens in a new tab) প্রকাশিত সংস্করণ 1 এর বেশ কয়েকটি অসঙ্গতি ঠিক করে। সংক্ষেপে এগুলো হলো:

  • ক্যাপিটালাইজেশন অযৌক্তিক এবং অসঙ্গতিপূর্ণ (scrypt ছোট হাতের অক্ষর, Kdf মিশ্র-হাতের অক্ষর, MAC বড় হাতের অক্ষর)।
  • এডড্রেস অপ্রয়োজনীয় এবং গোপনীয়তার সাথে আপস করে।
  • Salt মূলত কি ডিরাইভেশন ফাংশনের একটি প্যারামিটার এবং এটি সাধারণভাবে ক্রিপ্টোর সাথে নয়, বরং এর সাথেই যুক্ত হওয়া উচিত।
  • SaltLen অপ্রয়োজনীয় (এটি শুধু Salt থেকে ডিরাইভ করুন)।
  • কি ডিরাইভেশন ফাংশন দেওয়া আছে, তবুও ক্রিপ্টো অ্যালগরিদম হার্ড স্পেসিফাইড।
  • Version মূলত সংখ্যাসূচক হওয়া সত্ত্বেও এটি একটি স্ট্রিং (একটি স্ট্রিং দিয়ে স্ট্রাকচার্ড ভার্সনিং সম্ভব হতে পারে, তবে খুব কম পরিবর্তন হওয়া কনফিগারেশন ফাইল ফরম্যাটের জন্য এটিকে স্কোপের বাইরে বিবেচনা করা যেতে পারে)।
  • KDF এবং cipher ধারণাগতভাবে সমতুল্য (sibling) কনসেপ্ট হওয়া সত্ত্বেও এগুলো ভিন্নভাবে সাজানো হয়েছে।
  • MAC একটি হোয়াইটস্পেস অ্যাগনোস্টিক ডেটার মাধ্যমে গণনা করা হয়(!)

আগে লিঙ্ক করা পৃষ্ঠায় দেওয়া উদাহরণের সাথে কার্যকরীভাবে সমতুল্য নিচের ফাইলটি দেওয়ার জন্য ফরম্যাটে পরিবর্তন করা হয়েছে:

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++ ইমপ্লিমেন্টেশন। এর থেকে সমস্ত প্রয়োজনীয় বিষয় অপরিবর্তিত রয়েছে।

এই আর্টিকেলটি কি সহায়ক ছিল?