تخطٍ إلى المحتوى الرئيسي
Change page

تعريف التخزين السري لـ ويب3

آخر تحديث للصفحة: 21 أكتوبر 2025

لجعل تطبيقك يعمل على إيثريوم، يمكنك استخدام كائن web3 الذي توفره مكتبة web3.js. تحت الغطاء، يتواصل مع عقدة محلية من خلال مكالمات RPC. يعمل web3 (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 ملف مفتاح غير صالح
13 */
إظهار الكل

توثق هذه الوثيقة الإصدار 3 من تعريف تخزين ويب3 السري.

التعريف

يظل التشفير وفك التشفير الفعلي للملف دون تغيير إلى حد كبير عن الإصدار 1، باستثناء أن خوارزمية التشفير لم تعد ثابتة على AES-128-CBC (AES-128-CTR هو الآن الحد الأدنى من المتطلبات). معظم المعاني/الخوارزمية مشابهة للإصدار 1، باستثناء mac، والذي يتم تقديمه على أنه SHA3 (keccak-256) لعمليات ربط الـ 16 بايت الثانية من اليسار من المفتاح المشتق مع ciphertext الكامل.

يتم تخزين ملفات المفتاح السري مباشرة في ~/.web3/keystore (لأنظمة تشبه Unix) و ~/AppData/Web3/keystore (لأنظمة ويندوز). يمكن تسميتها بأي اسم، ولكن من الأعراف الجيدة أن يكون الاسم هو <uuid>.json، حيث <uuid> هو معرف UUID بحجم 128 بت الممنوح للمفتاح السري (وهو وكيل يحافظ على الخصوصية لعنوان المفتاح السري).

جميع هذه الملفات لها كلمة مرور مرتبطة بها. لاستنباط المفتاح السري لملف .json معين، قم أولاً باستنباط مفتاح تشفير الملف؛ ويتم ذلك من خلال أخذ كلمة مرور الملف وتمريرها عبر دالة اشتقاق المفتاح كما هو موضح بواسطة مفتاح kdf. يتم وصف المعلمات الثابتة والديناميكية المعتمدة على KDF لدالة KDF في مفتاح kdfparams.

يجب أن يكون PBKDF2 مدعومًا من قبل جميع التنفيذات المتوافقة مع الحد الأدنى، على الرغم من الإشارة إلى ذلك:

  • kdf: pbkdf2

بالنسبة لـ PBKDF2، تتضمن kdfparams ما يلي:

  • prf: يجب أن يكون hmac-sha256 (قد يتم تمديده في المستقبل)؛
  • c: عدد التكرارات؛
  • salt: الملح الذي تم تمريره إلى PBKDF؛
  • dklen: طول المفتاح المشتق. يجب أن يكون >= 32.

بمجرد اشتقاق مفتاح الملف، يجب التحقق منه من خلال اشتقاق MAC. يجب حساب MAC على أنه التجزئة (هاش) SHA3 (keccak-256) لمصفوفة البايت التي تشكلت من عمليات ربط الـ 16 بايت الثانية من جهة اليسار من المفتاح المشتق مع محتويات مفتاح ciphertext، أي:

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 لتتبع التغييرات الأصغر وغير المعطلة للتوافق في التنسيق.

متجهات الاختبار

تفاصيل:

  • العنوان: 008aeeda4d805471df9b2a5b0f38a0c3bcba786b
  • ICAP: XE542A5PZHH8PYIZUBEJEO0MFWRAPPIL67
  • UUID: 3198bc9c-6672-5ab3-d9954942343ae5b6
  • كلمة المرور: testpassword
  • السر: 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}
إظهار الكل

القيم الوسيطة:

المفتاح المشتق: f06d69cdc7da0faffb1008270bca38f5e31891a3a773950e6d0fea48a7188551 جسم MAC: e31891a3a773950e6d0fea48a71885515318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46 MAC: 517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2 مفتاح التشفير: 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}
إظهار الكل

القيم الوسيطة:

المفتاح المشتق: 7446f59ecc301d2d79bc3302650d8a5cedc185ccbb4bf3ca1ebd2c163eaa6c2d جسم MAC: edc185ccbb4bf3ca1ebd2c163eaa6c2ddd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2 MAC: 337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c مفتاح التشفير: 7446f59ecc301d2d79bc3302650d8a5c

التعديلات من الإصدار 1

يصلح هذا الإصدار العديد من التناقضات مع الإصدار 1 المنشور هنا (opens in a new tab). باختصار هذه هي:

  • استخدام الأحرف الكبيرة غير مبرر وغير متسق (scrypt بأحرف صغيرة، Kdf بأحرف مختلطة، MAC بأحرف كبيرة).
  • معالجة الأمور غير الضرورية والتي تعرض الخصوصية للخطر.
  • Salt هو في جوهره معلمة لدالة اشتقاق المفتاح ويستحق أن يرتبط بها، وليس بالتشفير بشكل عام.
  • SaltLen غير ضروري (فقط اشتقه من Salt).
  • تم تقديم وظيفة اشتقاق المفتاح، ولكن تم تحديد خوارزمية التشفير بشكل صارم.
  • Version هو رقم في جوهره ولكنه سلسلة نصية (سيكون تحديد الإصدارات المنظم ممكنًا باستخدام سلسلة نصية، ولكن يمكن اعتباره خارج نطاق تنسيق ملف تكوين نادر التغيير).
  • يعتبر KDF وcipher نظريًا من المفاهيم الشقيقة ولكنهما منظمان بشكل مختلف.
  • يتم حساب 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 عبارة عن تنفيذ مبكر للغة سي بلس بلس مع عدد من الأخطاء. تظل كل الأساسيات دون تغيير عنها.

هل كانت هذه المقالة مفيدة؟