عبارات البذور BIP39 ما يمثله 12 كلمة فعلاً وطريقة توليد محفظة HD
مُصطلح BIP39 هو ترميز القدرة على التمثيل بعبارات — هي البنية الكRYPTOغرافية وراء استعادة المحفظة. يُحلل هذا الدليل المعادلات الخاصة بالقائمة المكونة من الكلمات، خطوة بذرة PBKDF2، مسارات توليد BIP44، لماذا تختلف المحفظات في عناوينها، ونماذج فشل الأمان التي يجب أن يعرفها المطورون.
مُتسلسل BIP39 هو بيانات عشوائية بحجم 128 أو 256 بت، مُرمّز بعبارات بشرية باستخدام قائمة ثابتة من 2048 كلمة. هذه هي الميزة الأساسية. "السحر" يكمن في أن العبارات أسهل في الكتابة على الورق مقارنة بالسلاسل الستة عشر — من الناحية التشفيرية، لا يوجد شيء خاص في هذه الكلمات نفسها.
ما يصبح مثيرًا هو الطبقات الأربع المبنية على هذا الترميز: BIP39 (قائمة الكلمات والترميز)، BIP32 (استخلاص المفتاح التصاعدي)، BIP43 (ممارسات الحقول المخصصة)، وBIP44 (هيكل العملة/الحساب/العنوان). معظم التفسيرات تدمج جميع هذه الطبقات. هذا التفسير يفصل بينها.
قائمة الكلمات: 11 بت لكل كلمة، مع تحقق من التحقق من التوازن
ال قائمة كلمات BIP39 باللغة الإنجليزية تحتوي على 2048 كلمة. 211 = 2048، لذا تُعبّر كل كلمة عن 11 بت من المعلومات. تُحمل 132 بت من المعلومات في عبارة 12 كلمة، و264 بت في عبارة 24 كلمة.
ليست كل هذه البتات هي البتات المُولدة. بعض البتات في النهاية من الكلمة الأخيرة هي تحقق من التوازن — أول ENT/32 بت من SHA256(بتات البتات المُولدة)، حيث ENT هو طول البتات المُولدة بالبتات:
| طول العبارة | بتات البتات المُولدة (ENT) | بتات التحقق من التوازن (CS = ENT/32) | البتات الكليّة |
|---|---|---|---|
| 12 كلمة | 128 | 4 | 132 |
| 15 كلمة | 160 | 5 | 165 |
| 18 كلمة | 192 | 6 | 198 |
| 21 كلمة | 224 | 7 | 231 |
| 24 كلمة | 256 | 8 | 264 |
يُعد التحقق من التوازن السبب في فشل العبارات "الكثيرة قليلاً". إذا تغيرت بيت واحدة من البتات المُولدة، فإن حرف التحقق يتغير، مما يجعل العبارة غير صالحة. هذا يُكتشف أخطاء الكتابة — خصوصًا تلك التي تقع في بيتات التحقق من التوازن. ستُرفض العبارة بالكامل من قبل محفظات تتحقق من صلاحيتها قبل استخلاص المفاتيح. بعضها لا يتحقق، بل يُستخرج محفظة من بيانات غير صالحة.
مُتسلسل التمثيل في بايثون:
import hashlib, os
# Generate 128 bits of entropy
entropy = os.urandom(16) # 16 bytes = 128 bits
# Compute checksum: first 4 bits of SHA256(entropy)
h = hashlib.sha256(entropy).digest()
checksum_bits = format(h[0], '08b')[:4] # first 4 bits of SHA256 output
# Combine entropy bits + checksum bits
all_bits = format(int.from_bytes(entropy, 'big'), '0128b') + checksum_bits
# all_bits is now 132 bits
# Split into 11-bit groups -> 12 word indices (0-2047)
word_indices = [int(all_bits[i:i+11], 2) for i in range(0, 132, 11)]
# Look up each index in the BIP39 word list to get the mnemonic
العبارة ليست المفتاح: الخطوة PBKDF2
هنا تقع أغلب التفسيرات الخاطئة. لا تُعد العبارات 12 كلمة مفتاحك الخاص ولا تُستخدم مباشرة للتوقيع. هي ترميز وسيط. قبل استخلاص أي مادة مفتاح، يتم توسعة العبارة عبر PBKDF2-HMAC-SHA512:
import hashlib
mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
passphrase = "" # optional; empty string = no passphrase
seed = hashlib.pbkdf2_hmac(
'sha512',
mnemonic.encode('utf-8'), # password: the mnemonic words
('mnemonic' + passphrase).encode('utf-8'), # salt: always "mnemonic" + passphrase
2048, # iterations
dklen=64 # 512 bits output
)
# seed is 64 bytes (512 bits) -- this is what actually seeds key derivation
ملاحظتين:
- الملف المُضاف هو النص الأصيل
"mnemonic"مُضاف إليه كلمة المرور. إذا كانت الكلمة المرور فارغة، فإن الملف يكون فقط"mnemonic"— لا يوجد وضع منفصل "بدون كلمة مرور". - تُغيّر الكلمة المرور بالكامل النتيجة الناتجة. نفس 12 كلمة مع كلمة مرور
"A"— أي منهما تحتاجه؟"a"تُنتج محفظات مختلفة تمامًا مع عناوين مختلفة تمامًا. هذه هي ميزة "الكلمة 25": تسمح لك بالتمثيل الممكن للإخفاء (محفظتين من عبارة واحدة)، ولكن فقدان الكلمة المرور يكون دائمًا، حتى مع وجود 12 كلمة.
من المفتاح إلى المفتاح الرئيسي: BIP32
يُدخل المفتاح 512 بت إلى HMAC-SHA512 مع النص الثابت "Bitcoin seed". يُقسم المخرج 64 بايت إلى نصفين كل من 256 بت:
import hmac, hashlib
master = hmac.new(b'Bitcoin seed', seed, hashlib.sha512).digest()
master_private_key = master[:32] # left 256 bits: the actual EC private key
master_chain_code = master[32:] # right 256 bits: used for all child derivation
يُعد كود السلسلة هو السبب في عمل محفظات التصاعدي: يمنع استخلاص المفاتيح بالقوة حتى لو عرفت المفتاح الأب. بدونه، فإن معرفة المفتاح الأب والكلمة المُولدة لأحد الأبناء سيكشف كل المفاتيح الأبناء. مع كود السلسلة، يتطلب استخلاص المفتاح الأبناء مدخلات المفتاح الأب وكود السلسلة — ولهذا السبب، في حالة التصاعد المُعزز، يُستخدم المفتاح الأب المُباشر.
معًا، master_private_key + master_chain_code تُشكل المفتاح المُوسّع الرئيسي، مُرمّزًا بـ xprv... سلسلة Base58Check. المفتاح الموسّع المُقابل هو xpub... — مفيد للمحفظات المراقبة التي تحتاج إلى استخلاص العناوين دون كشف معلومات المفتاح.
ممرات التصاعد BIP44: م/44' /60' /0' /0/0 مُفككة
يُعرف BIP44 بسلسلة من الدرجات الخمس. إليك m/44’/60’/0’/0/0 — مسار العناوين الأولي للإيثريوم — مُفصّل على النحو التالي:
| مستوى | قيمة | مُدخل السجل الستي | معنى |
|---|---|---|---|
m | — | — | مفتاح الجذر |
44' | الغرض | 0x8000002C | غرض BIP44. التصاعد المُعزز (الإسقاط = 0x80000000 + المُدخل). |
60' | نوع العملة | 0x8000003C | إيثريوم، وفقًا لـ SLIP-0044. بيت كوين = 0′، سولانا = 501′، إلخ. |
0' | الحساب | 0x80000000 | الحساب الأول. يُزداد للحسابات المنفصلة. |
0 | التعديل | 0 | سلسلة خارجية (0 = عناوين الاستقبال، 1 = عناوين التغيير). لا يستخدم معظم المحفظات سلسلة التغيير على سلاسل EVM. |
0 | المُدخل | 0 | مُدخل العنوان. يُزداد للعنوان الثاني، الثالث، إلخ. |
يُشير الأسقاط إلى التصاعد المُعزز. يمكن توليد المفاتيح المُعززة فقط من المفتاح الأب، وليس من المفتاح الأب المُعلن. هذا مهم لأن التصاعد العادي (غير المُعزز) يُمكن أن يُكشف المفتاح الأب والكلمات المُتسلسلة من خلال معرفة مفتاح أبناء مُستقر ونقطة المفتاح الأب المُعلن. في مستويات الغرض، نوع العملة، والحساب، يكون التصاعد المُعزز هو المعيار.
لماذا تُنتج نفس العبارة عناوين مختلفة في محفظات مختلفة
العبارة والمسار الافتراضي للمحفظة هما متغيران مستقلان. كانت المحفظات تختلف في المسار تاريخيًا، وبعض هذه الاختلافات لا تزال غير مُحلّلة.
للمواد الإيثريوم، الانقسام الرئيسي:
- ميتا ماسك، ليد جي، معظم المحفظات الحديثة:
m/44'/60'/0'/0/N— مسار BIP44 القياسي. - ميو إيثريوم (المسار الافتراضي القديم):
m/44'/60'/0'/N— قصير مستوى واحد. تُنتج محفظة مُستعادة من نفس العبارة في ميو إيثريوم باستخدام المسار القديم مجموعة عناوين مختلفة تمامًا عن ميتا ماسك. - تريزور سويت: تتبع مسار BIP44 للإيثريوم الآن، لكنها كانت تمتلك ميزات خاصة في بعض العملات البديلة.
لبيت كوبت، الانقسام هو بنية: BIP44 (m/44'/0'/0'، الـ P2PKH، تبدأ العناوين بـ 1)، BIP49 (m/49'/0'/0'، الـ P2SH-P2WPKH، تبدأ العناوين بـ 3)، وBIP84 (m/84'/0'/0'، الـ P2WPKH المُدمج، تبدأ العناوين بـ bc1q) كلها تُنتج عناوين مختلفة من نفس المفتاح. يُخبرك تنسيق العنوان عن المسار المستخدم، وهذا هو السبب في أهمية تنسيق العنوان عند حل مشكلة استعادة.
إذا استوردت عبارة و"الأساسات غير موجودة"، فتحقق من مسار التصاعد قبل أن تفترض أن العبارة خاطئة. تسمح معظم المحفظات بتحديد المسار يدويًا أثناء الاستيراد المتقدم.
أنواع فشل الأمان
الكود التشفيري هنا ليس هو الضعيف. كل هجوم يُستخدم ضد محفظات BIP39 يُركز على الجانب البشري من سلسلة التدفق.
الاحتيال: "أدخل عبارة الاستعادة لمواصلة"
الهجوم الأعلى حجمًا بفارق كبير. واجهات مزيفة للمحفظات، ملحقات المتصفح المُدخلة من برامج مهتمة، أو ممثلين لدعم العملاء في ديسكورد — جميعهم يطلبون من المستخدمين كتابة 12 كلمة في مكان ما. النموذج الذهني الصحيح: لا تطلب أي برامج محفظة مفتاح الاستعادة بعد التثبيت الأولي. أي طلب للعبارة هو هجوم، بغض النظر عن مظهر الواجهة.
مراقبة المُلصق
البرمجيات الخبيثة التي تراقب المُلصق، تكتشف تسلسلًا من 12 أو 24 كلمة معرفة من BIP39، وتُخرجها. فترة التسرب هي مللي ثانية. عند نسخ عبارة المفتاح إلى أي مكان — حتى لبضع ثوانٍ في محرر نصي — يُخلق التعرض. المُديرين المُلصق (مُلصق ويندوز، مُديرين ماك، مُديرين لصق في بيئة تطوير) هم من الأعلى خطرًا.
الصور والتنزيل السحابي
إتخاذ صورة لعبارة المفتاح على الهاتف يُرفع إلى iCloud Photos أو Google Photos في ثوانٍ، قبل أن يكمل معظم الناس قراءة العبارات. هذه النسخ الاحتياطية ليست مشفّرة على مستوى العميل. "أخذت صورة للحفاظ عليها" هو مسار تسرب مباشر. الاحتفاظ بنسخة على ورقة في مكان مادي يُعد توصية حقيقية.
توليد عبارة مُتسلسلة على الخادم
أي موقع ويب يولد عبارة BIP39 على الخادم يحتفظ بنسخة من البتات المُولدة. المكان الوحيد الآمن للاستنتاج هو جهاز تحكم، وخارج التوليد في الوقت نفسه. محفظة مادية، جهاز مُفصل عن الشبكة، أو أداة مُراجع مُثبتة على مستوى العميل. الموقع لا ينتمي إلى أي من هذه الأشياء — حتى لو كان الكود بالجافاسكربت صحيحًا، لا يمكنك التحقق من أن الخادم لا يسجل النتيجة.
إذا كنت بحاجة إلى فحص أو تحقق من بنية العبارة — تحقق من البتات المُولدة، رؤية المفتاح المُولّد، تحقق من المسار — فإن محول BIP39 Mnemonic يتم تشغيله بالكامل داخل المتصفح. لا تغادر العبارة من جهازك، وهو هو الهيكل الوحيد الآمن لهذا الاستخدام.
المنظور للمطورين: من المرجح أنك لن تتعامل مع عبارات المفتاح في تطبيقك
إذا كنت تبني تطبيقًا مجاورًا للعملات الرقمية، فإن التوجه لـ "التعامل مع عبارة المفتاح في الخلفية" هو غالبًا خطأ. مساحة الهجوم:
- التسجيل. يُسجل كل إطار ويب محتوى الطلبات في مكان ما. خطوة واحدة من التصحيح، أو مستوى تسجيل خاطئ، وجميع العبارات التي مرّت عبر خدمة الـ API تُسجل على القرص — بشكل دائم، عبر عدة أهداف تسجيل لم تُراجع.
- الانتقال. يحمي HTTPS من الشبكة. لكنه لا يحمي من مُوزع الشبكة، أو عملية الخلفية، أو قاعدة البيانات، أو مُجمّع السجلات. كلها هي مساحات هجوم منفصلة.
- الذاكرة. تُسجل ملفات الذاكرة، تقارير التوقف، ملفات الذاكرة، وسلاسل الذاكرة في الذاكرة. عبارة المفتاح في مصفوفة بايثون أو مصفوفة جافاسكربت ليست مُزالة بشكل صفر؛ من المرجح أن تظهر في عدة توزيعات قبل أن تُحذف.
- المسؤولية. إذا كانت الخلفية تُعالج عبارات المفتاح من قبل المستخدمين، فإن الضرر سيكون دائمًا. بخلاف كلمات المرور، لا يوجد آلية لإعادة التعيين. سيُفقد المستخدمون أموالهم دون أي وسيلة للإبلاغ.
الهيكل الذي يعمل فعليًا: استخرج ما تحتاجه على الجانب العلوي وقلّل من النقل — مفتاح علوي، مفتاح قابل للقراءة فقط (xpub)، أو ترتيب موقّع. لا يرى الخلفية عبارة المفتاح. الأدوات التي تفعل ذلك بشكل صحيح: @scure/bip39 (مُراجع، محدود الاعتماد)، ethers.jsو، و bitcoinjs-lib. للتكامل مع محفظات المعدات، تُرجع أدوات Trezor وLedger ترتيبًا موقّعًا — لا يغادر المفتاح من الجهاز.
السلسلة الكاملة للتحويل
| خطوة | مدخل | عملية | انتاج | |
|---|---|---|---|
| 1. البتات المُولدة | 128–256 بت عشوائي | مُتحقق من SHA256 → مجموعات من 11 بت | عبارة 12–24 كلمة |
| 2. المفتاح المُولّد | كلمات العبارات + "العبارة" + كلمة المرور | PBKDF2-HMAC-SHA512، 2048 دور | مفتاح مولّد بحجم 512 بت (64 بايت) |
| 3. المفتاح الرئيسي | بُتات المفتاح المُولّد | HMAC-SHA512("مفتاح بيت كوبت"، المفتاح المُولّد) | مفتاح مُولّد رئيسي (256 بت) + كود السلسلة (256 بت) |
| 4. مفتاح الحساب | مفتاح الرئيسي + مسار م/44' /60' /0' | تحويل أبناء BIP32 المُعزز × 3 | مفتاح موسّع للحساب |
| 5. مفتاح العنوان | مفتاح الحساب + مسار /0/N | تحويل أبناء BIP32 العادي × 2 | مفتاح أبناء → مفتاح علوي secp256k1 → keccak256 → العنوان |
أكمل BIP39 ما كان مُصممًا له: جعل البتات المُولدة قابلة للقراءة والاسترجاع. ليس هناك ضعف في التشفير — PBKDF2 بـ 2048 دور، HMAC-SHA512، secp256k1 — كلها مُثبتة. الهجمات هي عملية فقط: إدخال العبارة في مكان لا ينبغي أن تُدخل، أو تخزينها رقميًا، أو الاعتماد على أداة تولّدها على الخادم. الحسابات جيدة. الضعف هو البشري، وهذا هو السبب في توصية المطورين "أعدّ نظامك بحيث لا تصل العبارة إلى بنية مُنتجة بك".
قد يعجبك أيضاً
تثبيت ملحقاتنا
أضف أدوات IO إلى متصفحك المفضل للوصول الفوري والبحث بشكل أسرع
恵 وصلت لوحة النتائج!
لوحة النتائج هي طريقة ممتعة لتتبع ألعابك، يتم تخزين جميع البيانات في متصفحك. المزيد من الميزات قريبا!
