تعريف التخزين السري لـ ويب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")34fs.readFile("keyfile.json", (err, data) => {5 var json = JSON.parse(data)6 var result = recognizer(json)7})89/** النتيجة10 * [ 'web3', 3 ] ملف مفتاح web3 (v3)11 * [ 'ethersale', undefined ] ملف مفتاح Ethersale12 * 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 لتتبع التغييرات الأصغر وغير المعطلة للتوافق في التنسيق.
متجهات الاختبار
تفاصيل:
العنوان:008aeeda4d805471df9b2a5b0f38a0c3bcba786bICAP:XE542A5PZHH8PYIZUBEJEO0MFWRAPPIL67UUID: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": 319}إظهار الكلالقيم الوسيطة:
المفتاح المشتق: 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": 320}إظهار الكلالقيم الوسيطة:
المفتاح المشتق: 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": 118 },19 "id": "0498f19a-59db-4d54-ac95-33901b4f1870",20 "version": 221}إظهار الكلالتعديلات من الإصدار 2
كانت النسخة 2 عبارة عن تنفيذ مبكر للغة سي بلس بلس مع عدد من الأخطاء. تظل كل الأساسيات دون تغيير عنها.