الأخبار · الأمان في Blackbear
ما لا نستطيع قراءته
Blackbear محلي أولًا. كل ميزة تعمل على جهازك، وبياناتك افتراضيًا تعيش هناك وحده، دون أي خادم في الطريق.
حين تشغّل المزامنة السحابية، تبدأ خوادمنا بنقل بياناتك بين أجهزتك وأشخاصك. تشرح هذه السلسلة ما يعنيه ذلك لخصوصيتك. يتناول الجزء 1 التشفير: ما الذي يغادر جهازك، ولماذا لا نستطيع قراءته. والجزء 2 سجل صادق للبيانات الوصفية التي تحتفظ بها خوادمنا فعلًا. ويتناول الجزء 3 المشاركة والتعاون.
كل ما يلي وصفٌ لشيفرة صدرت فعلًا، لا لنوايا. حيثما نذكر خوارزمية أو رقمًا، فهو ما يعمل في بيئة الإنتاج اليوم.
التشفير يحدث على جهازك
كل تغيير تزامنه يُشفَّر قبل أن يلمس الشبكة: الملاحظات، والمستندات، والمهام، والأحداث، وتدوينات اليوميات، والجداول، واللوحات، والصوت، وسجل الإصدارات. كلٌّ منها يُختم بـXChaCha20-Poly1305، وهو تشفير موثّق، بمفتاح لا يغادر جهازك أبدًا دون حماية. تستقبل خوادمنا نصًا مشفّرًا وتخزّن نصًا مشفّرًا.
وتلقى الصور والملفات الصوتية المعاملة نفسها: تُشفَّر على جهازك وتُرفَع كتلًا معتمة.
الشيفرة التي تفعل كل ذلك تنفيذ واحد بلغة Rust مبني على منظومة RustCrypto، ومُترجَم إلى WebAssembly. يتشاركه التطبيق وBlackbear CLI بايتًا ببايت، ونختبره مقابل نماذج اختبار بين اللغات حتى لا ينحرف أي تنفيذ ثانٍ بصمت.
ما يحميه هذا، وما لا يحميه
التشفير أداة محددة، لا درع سحري. قبل التفاصيل، الحدود.
يحميك هذا التصميم من:
- اختراق سلبي لخوادمنا أو قاعدة بياناتنا، أي سرقة البيانات المخزّنة. ما يتسرّب حينها هو نص مشفّر ومفاتيح مغلّفة.
- منّا نحن. لا تستقبل أنظمتنا العاملة مفاتيح محتواك أو نصّه الصريح أبدًا، فأي طلب قانوني لمحتواك لا ينال إلا ما نحتفظ به فعلًا: بيانات وصفية (الجزء 2) وكتل مختومة.
ولا يحميك من:
- جهاز مخترَق أو مسروق أو مفتوح القفل. جهازك يحمل مفاتيحك؛ وأمانه هو الأرض التي يقف عليها كل شيء آخر.
- أي شخص يملك عبارة مرورك أو كلمات الاسترداد الاثنتي عشرة.
- ما يفعله المستلمون المأذون لهم بما تشاركه. المشاركة ثقةٌ بالناس، لا بالرياضيات وحدها.
- البيانات الوصفية للحركة: من، ومتى، وكم. وهذا هو موضوع الجزء 2 كله.
- التطبيق نفسه. على الويب يصل التطبيق من خوادمنا مع كل تحميل؛ وعلى سطح المكتب عبر إصدارات موقّعة. لا يصمد أي نظام تشفير أمام تطبيق خبيث، أيًّا كان من يصدره.
- اللحظات التي تختار فيها إرسال بيانات مكشوفة: حين تطلب من Pax استخدام نموذج سحابي، أو تربط تقويمًا خارجيًا، أو تصدّر ملفات، أو ترسل دعوة بالبريد. تذهب هذه إلى الطرف الذي اخترته، عن قصد، وتخضع لسياساته هو، لا لتشفيرنا.
تسلسل المفاتيح
عبارة مرورك لا تغادر جهازك أبدًا، ومنها ينبثق كل شيء:
- تمرّ عبارة مرورك عبر Argon2id، وهي دالة اشتقاق مفاتيح شديدة الاستهلاك للذاكرة، مضبوطة على 64 MiB من الذاكرة وثلاث تمريرات وأربعة مسارات. ويخرج منها مفتاح حسابك.
- يغلّف مفتاح الحساب مفتاح الخزنة: مفتاح عشوائي بطول 256 بت يُولَّد على جهازك. ومفتاح الخزنة هو ما يشفّر بياناتك فعلًا.
- تخزّن خوادمنا مفتاح الخزنة المغلّف، والملح، ومعاملات الضبط. والمفتاح المغلّف نفسه نص مشفّر؛ ودون عبارة مرورك هو مجرد ضجيج.
لا يخزّن الخادم إلا النسخ المغلّفة: نص مشفّر يحمي نصًا مشفّرًا.
لماذا هذه الطبقة الوسيطة؟ لأنها تتيح لك تغيير عبارة مرورك دون إعادة تشفير حياتك كلها، وتتيح وجود الاسترداد دون إضعاف الباب الأمامي.
وتنبيه يستحق أن يُكتب: يجعل Argon2id التخمين مكلفًا، لكنه لا يستطيع أن يجعل عبارة مرور ضعيفة قوية. مفتاح الخزنة المغلّف قويٌ بقدر عبارة المرور التي تغلّفه تمامًا. اختر عبارة طويلة.
الاسترداد اثنتا عشرة كلمة
حين تُعدّ المزامنة، يعطيك Blackbear عبارة استرداد: اثنتا عشرة كلمة (BIP39) ترمّز 128 بتًا من العشوائية. منها يُشتق مفتاح مستقل يغلّف مفتاح الخزنة مرة ثانية.
أضعت عبارة مرورك؟ تعيدك الكلمات الاثنتا عشرة. أضعت الاثنتين؟ فبياناتك المتزامنة ضاعت. لا نستطيع إعادة ضبطها، ولن تقنعنا أي تذكرة دعم بذلك، لأنه لا شيء لدينا لنعيد ضبطه. هذه ليست ثغرة في دعمنا، بل هي التصميم يصمد.
إضافة جهاز
على جهاز جديد، تدخل عبارة مرورك. يشتق منها مفتاح حسابك محليًا، ويفكّ مفتاح الخزنة من النسخة المغلّفة التي يحتفظ بها خادمنا. لا يرى الخادم عبارة المرور أبدًا، ولا يرى النتيجة أبدًا.
ويستطيع جهاز موجود مفتوح القفل أن يسلّم المفتاح مباشرة أيضًا: يختم مفتاح الخزنة بالمفتاح العام X25519 الخاص بالجهاز الجديد، ويضعه في خانة نقل تتلف نفسها بعد خمس دقائق، استُخدمت أم لم تُستخدم. وهنا حدّ صادق واحد: يتعرّف جهازك الموجود على المفتاح العام للجهاز الجديد عبر حسابك المسجّل، لذا يثق هذا المسار المُعان بأن ينقل خادمنا المفتاح الصحيح للجهاز الذي اخترته. أما مسار عبارة المرور فلا يحتاج إلى مثل هذه الثقة.
ولأن هذه المفردات هي بالضبط ما قد يستعيره المحتالون، فهذه قاعدة تستحق الكتابة: لن نطلب منك أبدًا عبارة مرورك أو كلمات الاسترداد، ولن نطلب منك أبدًا الموافقة على نقل إلى جهاز. هذه الطلبات مكانها داخل تطبيق فتحته بنفسك فقط. وأي أحد غيره يطلبها فهو يهاجمك.
الرسائل
تستخدم المراسلة مفاتيح خاصة بها، منفصلة عن المزامنة. لكل حساب هوية مراسلة X25519، وكل رسالة تشتق مفتاحًا فريدًا من ملح جديد خاص بها عبر HKDF-SHA256. تنتقل الرسائل في ظروف مختومة، يمرّرها الخادم ولا يستطيع فتحها. ويتناول الجزء 2 ما يكشفه ظاهر الظرف.
وملاحظة تصميمية نقولها بوضوح: المفاتيح الفريدة لكل رسالة ليست تصميم السقاطة الدوّارة الذي تستخدمه بعض تطبيقات المراسلة. لو اختُرق مفتاح المراسلة طويل الأمد لجهاز ما يومًا، لكانت الرسائل المختومة له في خطر. المفاتيح لكل رسالة تحدّ من نطاق الضرر، لكنها ليست سريةً أمامية، ونفضّل أن تعرف الفرق.
سجل دون بصمات للمحتوى
يتزامن سجل الإصدارات لقطاتٍ مشفّرة، معرّفة بمعرّفات محصورة بخزنتك. لو حفظت أنت وشخص غريب ملفًا متطابقًا، فسيرى الخادم معرّفين لا صلة بينهما: لا يمكن مطابقة المحتوى المتطابق بين الحسابات. يبقى الحجم والتوقيت مرئيين، مثل كل حركة المزامنة. هذه بيانات وصفية، والجزء 2 هو مكان هذا الموضوع.
إثبات دون كشف
تتطلّب عمليات الحساب التي لا رجعة فيها إثباتًا للخزنة: توقيعًا بمفتاح Ed25519 مشتق من مفتاح خزنتك. تثبت أنك تملك الخزنة دون أن تنتقل الخزنة أبدًا. وحين تؤدي المفاتيح عملها في الذاكرة، تُصفَّر.
لا شيء من هذا غريب. XChaCha20-Poly1305 وArgon2id وX25519 وEd25519 وHKDF-SHA256: أدوات أساسية قياسية، مملّة، ومراجَعة بكثافة. الجزء المثير هو الانضباط في تطبيقها في كل مكان، وفي الجهر بما لا تغطيه. وهذا الانضباط هو موضوع بقية هذه السلسلة.
للاستزادة
- Local-first software — مقالة Ink & Switch التي تقف وراء هذه الفلسفة
- RFC 9106 — مواصفات Argon2
- XChaCha20-Poly1305 — مسودة مواصفات IETF
- RFC 7748 — المنحنيات الإهليلية وراء X25519
- RFC 8032 — تواقيع Ed25519
- The Password Hashing Competition — حيث فاز Argon2
الأمان في Blackbear
- 1. ما لا نستطيع قراءته (أنت هنا)
- 2. ما تراه خوادمنا
- 3. كيف تبقى المشاركة مختومة