نحن على Product Hunt اليوم! اترك تعليقًا
أصبح Authenticator 1.16.0 متاحًا. اطّلع على الجديد
نظرة تقنية موجّهة لمن يراجع الأمان. كل ما هنا يمكن التحقق منه في الشيفرة المصدرية — بما في ذلك الجوانب التي ليست في صالحنا، ونذكرها بدل أن نغفلها.
الإضافة هي إضافة كروم بمواصفة Manifest V3 تولّد رموز TOTP محليًا باستخدام OTPAuth. توليد الرموز وتخزين الحسابات وتشفيرها لا يمرّ بأي خادم خلفي، ولا توجد حسابات مستخدمين. نشغّل خادمًا واحدًا، api.authenticator.sh، من أجل الخطة المجانية وPro — وهو موصوف أدناه — ولا يتلقى أبدًا مفتاحًا سريًا ولا اسم حساب ولا اسم خدمة ولا رمزًا.
ولا يحتفظ ذلك الخادم بأي مادة مفاتيح لحسابات أي أحد: فلا إيداع للمفاتيح، ولا مسار استرداد نتحكم به. إذا نسي المستخدم كلمة المرور وفقد رمز الاسترداد، فلا حيلة لنا — وهذا مقصود بالتصميم.
الحماية بكلمة مرور اختيارية ومعطّلة افتراضيًا. وعند تفعيلها:
لا تُشفَّر البيانات إطلاقًا بمفتاح مشتق من كلمة المرور مباشرة. يشفّر السجلات مفتاح رئيسي عشوائي؛ أما ناتج PBKDF2 فيغلّف ذلك المفتاح الرئيسي فقط. ويترتب على ذلك أمران، وكلاهما مهم:
عند تفعيل الحماية بكلمة مرور، يُشفَّر سجل الحساب بالكامل عدا معرّفه وبصمته — بما في ذلك اسم الخدمة، فلا يكشف ملف تعريف مسروق عن الخدمات التي يملك المستخدم حسابات فيها. وعند التفعيل تشفّر الإضافة السجلات، ثم تتحقق منها بفك التشفير والمقارنة، وبعد ذلك فقط تحذف كل نسخة بنص واضح: التخزين المحلي للمتصفح، والمزامنة، ولقطات النسخ الاحتياطي السبع المتناوبة كلها.
نقولها صراحةً لأنها تهمّ تقييمكم:
باختصار: هذا يحمي البيانات في حالة السكون. أما جهاز يقع أثناء الاستخدام تحت سيطرة مهاجم فعلًا، فلا يحميه ولا يستطيع.
يعلن الملف التعريفي خمسة أذونات ولا يعلن أي إذن مضيف:
لا توجد لا توجد أي سكربتات محتوى، ولا أذونات tabs أو cookies أو webRequest، ولا web-accessible resources. لا شيء يخصنا موجود في الصفحة حتى تطلب رمزًا فيها؛ وما يعمل حينها يُحقَن لتلك العلامة وحدها ولذلك الاستدعاء وحده، بموجب الإذن الذي تمنحه نقرتك أنت، ولا يترك خلفه شيئًا.
يعمل مسح رمز QR بالكاميرا في صفحة تابعة للإضافة تُفتح في تبويب، لا في النافذة المنبثقة — فالنافذة المنبثقة تُدمَّر حين تفقد التركيز، وهذا بالضبط ما يفعله طلب الإذن. وهذا لا يحتاج أي إذن في ملف البيان: فهو يستخدم طلب الكاميرا القياسي في المتصفح، يُمنح لأصل الإضافة ويمكن سحبه من إعدادات الموقع، ولا يُطلب أبدًا قبل أن يفتح المستخدم الماسح. ويُفكّ ترميز الفيديو محليًا ولا يُرسل ولا يُخزَّن إطلاقًا.
منذ الإصدار 1.14.0 تتصل الإضافة بـ api.authenticator.sh مرة يوميًا — عند بدء تشغيل المتصفح، أو بعد اكتمال عرض النافذة المنبثقة، ولا يعترض ذلك أبدًا طريق عرض رمز. الطلب قائمة مغلقة من الحقول، تُبنى في دالة واحدة داخل src/billing/sync.ts، ويُلزمها اختبار بتلك القائمة:
لا يُرسَل أبدًا: المفاتيح السرية، وأسماء الحسابات، وأسماء الخدمات، والرموز، والمواقع التي تُستخدم عليها. يستخلص الخادم البلد من الطلب عند طرف شبكته (edge) ولا يخزّن عنوان IP. وتتلقى صفحة الإزالة معرّف التثبيت نفسه في المعامل ?i=: فتُبلغ الخادم بأن التثبيت قد أُزيل، وتربط به إجابة الاستبيان الاختيارية.
ما يُحفظ لهذا الغرض في chrome.storage.local: معرّف التثبيت، وآخر سياسة وآخر ترخيص موقّعين، ومفتاح الترخيص الذي يحمله هذا التثبيت (سواء كتبه المستخدم أو وصله بعد الشراء منه)، وعدد مرات الفتح في كل يوم إلى أن يتسلّمه الخادم، والأحداث المنتظرة — ولا شيء من بيانات الحسابات. وحين تكون المزامنة مفعّلة، يذهب أيضًا إلى Chrome Sync ما يبيّن إن كان التثبيت يسبق الفوترة، ومفتاح الترخيص ذاك، لكي تلتقطهما ملفات تعريف Chrome الأخرى لدى المستخدم فيُفعَّل Pro فيها تلقائيًا؛ وإيقاف المزامنة يزيلهما من Chrome Sync، وإعادة تشغيلها تعيدهما.
ما يعود من الخادم، وكيف تتعامل الإضافة معه:
الحدّ ليس DRM: الشيفرة مفتوحة المصدر، ويمكن لأي نسخة متفرّعة (fork) أن تزيله. أما ما يجب ألا يكون ممكنًا أبدًا فهو أن يحصل شخص على ترخيص شخص آخر أو يستخدمه، أو أن يجعل تثبيت غيره محدودًا — فتلك ثغرة، وتقع ضمن نطاق سياسة الأمان لدينا.
نوعان من الطلبات تُرسلهما الإضافة من تلقاء نفسها: فحص الساعة والاتصال اليومي الخاص بالفوترة. وكل ما عداهما أدناه يحدث لأن المستخدم نقر على شيء. ويمنع Manifest V3 الشيفرة البعيدة، ولا شيء مما يلي يحمل حسابات أو مفاتيح سرية أو رموزًا مولَّدة. والقائمة كاملةً:
| المضيف | متى | هل تحمل بيانات المستخدم؟ |
|---|---|---|
| time.akamai.com timeapi.io cloudflare.com | فحص انحراف الساعة، مع تخزين مؤقت؛ وإذا تعذّر الوصول إلى أي مصدر تذكر الإعدادات ذلك. انحراف الساعة يعطّل TOTP. | لا |
| authenticator.sh | صفحة الترحيب عند التثبيت؛ وصفحة الملاحظات عند الإزالة، وفي عنوانها معرّف التثبيت؛ وصفحتا المساعدة والدعم عند فتحهما من النافذة المنبثقة. | معرّف التثبيت، في صفحة الإزالة فقط؛ وفيما عدا ذلك لا (سجلات خادم ويب اعتيادية) |
| api.authenticator.sh | الاتصال الخاص بالفوترة مرة يوميًا؛ واستدعاءات الدفع والترخيص والبوابة حين يشتري المستخدم Pro، أو يُدخل مفتاحًا، أو يستعيد عملية شراء، أو يدير اشتراكًا. | الحقول المذكورة أعلاه — ولا بيانات حسابات أبدًا. ولا يُرسَل مفتاح ترخيص أو عنوان بريد إلكتروني إلا حين يكتبه المستخدم |
| checkout.stripe.com billing.stripe.com | Stripe Checkout وبوابة العملاء، تُفتحان في تبويب حين يشتري المستخدم Pro أو يدير اشتراكًا. | ما يُدخله المشتري هناك. وتسري شروط Stripe وLink الخاصة بهما |
| chromewebstore.google.com | صفحة المتجر، تُفتح في تبويب عند النقر فقط: نموذج المراجعة من طلب التقييم. | لا (ترى Google زيارةً لصفحة متجر كأي زيارة أخرى) |
لا تُحمَّل أي خطوط أو سكربتات أو أنماط أو صور من مضيفات خارجية. وكل ما يلزم لعرض الواجهة مضمّن داخل الحزمة.
لستم مضطرين لتصديق أي مما سبق. الإضافة مفتوحة المصدر، وكل إصدار قابل لإعادة الإنتاج:
.crx المنشور من متجر كروم الإلكتروني وفكّوا ضغطهnpm ci && npm run build على Node 20 LTSdist/ الناتج بالحزمة المفكوكةيُنشر مع كل إصدار على GitHub تجزئة SHA-256 لكل ملف داخل dist/ المُنتَج، باسم SHA256SUMS-v<version>.txt وبصيغة sha256sum، فتصبح الخطوة الرابعة تشغيلًا واحدًا للأمر sha256sum -c. ويُفترض أن تقتصر الفروق على ترتيب الملفات داخل الأرشيفات وعلى المسافات في المخرجات المصغّرة بين إصدارات Node التصحيحية.
اعتماديات وقت التشغيل قليلة عن قصد — OTPAuth وReact وjsQR وZustand وFramer Motion وLucide — ومثبّتة عبر ملف قفل محفوظ في المستودع. ونوفّر قائمة مكوّنات SBOM بصيغة CycloneDX عند الطلب.
اطّلعوا على الشيفرةنحن مزوّد صغير ومستقل. إن كان أي مما يلي شرطًا لازمًا في عمليتكم، فمن الأفضل أن تعرفوه الآن لا بعد ثلاثة أسابيع من التقييم:
وما نقدّمه بدلًا من ذلك: شفافية كاملة للشيفرة المصدرية، وبناء قابل للتحقق، وأقل قدر ممكن من الأذونات، وخادم لا تُرسَل إليه أسراركم ولا أسماء حساباتكم ولا رموزكم من الأساس.
بلاغات الثغرات وأسئلة الأمان: security@authenticator.sh. سياسة الإفصاح لدينا ونطاقها وأزمنة الاستجابة وشروط الملاذ الآمن موجودة في صفحة سياسة الأمان؛ أما ما يُخزَّن وما يغادر الجهاز فمبيَّن في سياسة الخصوصية.
يسعدنا الإجابة على استبيان تقييم مورّد مكتوب، أو مراجعة الشيفرة خطوة بخطوة مع فريق أمني.
لأي أمر خارج نطاق الأمان — التثبيت، أو استعادة الحساب، أو أسئلة الفوترة في نشر مؤسسي — راجعوا الدعم. ونرجو عدم إرسال بلاغات الثغرات إلى هناك؛ فذلك البريد لا يُعامل على أنه سرّي.