واجهة password.es البرمجية تستجيب الآن: كيف تُستخدم

نُشر في بقلم David Carrero

تكرّر هذه المدونة الشيء نفسه منذ شهور: كلمة مرورك يجب ألا تغادر متصفحك. المولّد يأخذ العشوائية من crypto.getRandomValues() على جهازك أنت، والمدقّق يحلّل ما تكتبه دون أن يرسله إلى أي مكان.

واليوم ننشر واجهة برمجية تولّد كلمات المرور على خادم.

التناقض واضح ولن نموّهه: كل استجابة من الواجهة تحمل تنبيهًا يقول ذلك بالضبط. لكن هناك مواضع لا متصفح فيها — سكربت ينشئ مئة حساب، خادم يصدر اعتمادًا مؤقتًا، مساعد يطلب منه أحدهم كلمة مرور فيختلقها — وهناك لا يكون البديل «المتصفح»: بل random() مُختار بسوء، أو سلسلة مكتوبة باليد. لهذا وُجدت.

الاستدعاء كاملًا

بلا مفتاح، وبلا تسجيل، وبلا ترويسات. هذا كل شيء:

curl -X POST https://api.password.es/v1/generate

يعيد كلمة مرور من 16 حرفًا وتحليلها. نُفِّذ أثناء كتابة هذه الفقرة: x*7$9,BUy9PPvOI?، مأخوذة من أبجدية من 89 حرفًا، 103.6 بت من الإنتروبيا، وزمن كسر يبلغ 2.5 × 10¹¹ سنة. المستوى 4 من 4.

لا شيء من هذه الأرقام جديد. تخرج من المحرك نفسه الذي يرسم المقياس في الصفحة الرئيسية: صيغة البتات نفسها، ونموذج الهجوم نفسه — 10¹² محاولة في الثانية، دون اتصال، بتجزئة سريعة — ومقياس المستوى نفسه الذي يستخدمه المدقّق. لو أعطى الموقع والواجهة رقمين مختلفين لكلمة المرور نفسها، لكان أحدهما يكذب.

ما الذي يعود، حقلًا حقلًا

تحمل الاستجابة passwords — دائمًا مصفوفة، حتى لو طلبت واحدة — وكتلة analysis فيها length وpool وbits وlog10_guesses وcrack_time_log10_seconds وcrack_time وlevel وlevel_scale وceiling.

اثنان منها يستحقان فقرة. level_scale يقول من أين جاء المستوى (اليوم دائمًا "time")، حتى يظهر أي اختلاف مستقبلي بين الموقع والواجهة في الحقل بدلًا من استنتاجه بمقارنة الأرقام. وceiling يقول إن كان الرقم دقيقًا أم سقفًا: في generate يكون دائمًا false، لأن الخادم هو من صنع كلمة المرور ويعرف بأي أبجدية؛ أما في مدقّق الموقع فلا يمكن ذلك دائمًا، لأن كلمة المرور هناك تأتي منك أنت.

ثم يأتي notice، أي التنبيه، وكتلة _meta فيها الخطة واللغة المطبَّقة والحدود ورابط إلى التوثيق.

الخيارات

كلها اختيارية، وأسماؤها بالإنجليزية لأن من يدمج واجهة برمجية يكتب أسماء الحقول كما هي: length (‏4–64، الافتراضي 16)، count (‏1–20)، lower، upper، digits، symbols، exclude_ambiguous، no_repeats وlang.

curl -X POST https://api.password.es/v1/generate -H 'content-type: application/json' -d '{"length":20,"exclude_ambiguous":true}'

تفصيلان يذكرهما التوثيق ويُستحسن معرفتهما قبل الدمج. exclude_ambiguous يحذف ستة أحرف لا سبعة: يستبعد 0 O 1 I l | o، لكن الشرطة العمودية لم تكن أصلًا ضمن مجموعة الرموز، فتنزل الأبجدية من 89 إلى 83 لا إلى 82. لهذا تقرأ في الاستجابة pool بقيمة 83. وno_repeats ليس ضمانًا مطلقًا: يعيد المحاولة عشر مرات، تمامًا كما يفعل مولّد الموقع، وعند 64 حرفًا يمرّ تكرار متجاور في نحو 0.1 % من الحالات. قول ذلك أنفع من الوعد بعكسه.

لغة الاستجابة

افتراضيًا تجيب بالإنجليزية، وهو ما يتوقعه من يدمجها دون أن يقول شيئًا. تتغير عبر ?lang= في الرابط، أو "lang" في الجسم، أو ترويسة Accept-Language، وعند التعارض يفوز الأول. اللغة غير الموجودة ليست خطأً: تسقط إلى الإنجليزية.

هنا لا تماثل لا يمكن تخمينه، ولذلك تصرّح به الواجهة نفسها: الرسائل موجودة بالإنجليزية والإسبانية؛ أما الروابط فبلغات الموقع الثماني عشرة كلها. طلب الألمانية يعطيك روابط بالألمانية ورسائل ما زالت بالإنجليزية. لا داعي للتخمين: يحمل _meta.lang القيمتين { "messages", "links" } بما طُبِّق على كل نصف.

خادم MCP

‏MCP هو البروتوكول الذي يستخدم به مساعد — مثل Claude أو ChatGPT — أدوات خارجية. وhttps://api.password.es/mcp خادم MCP بلا تسجيل وبلا مفتاح، ينشر أداة واحدة فقط: generate_password، بالمعاملات نفسها المذكورة أعلاه.

هذا هو الجزء الأهم بالنسبة لنا، وليس لأسباب تقنية: المساعد الذي لا يجد من أين يأتي بكلمة مرور يختلقها، وما يخرج من ذلك ليس عشوائيًا، بل ما يظنّ النموذج أن له هيئة كلمة مرور. ومع توصيل الخادم يكفّ عن الارتجال ويعيد واحدة مصنوعة بـ crypto.getRandomValues()، مع تحليلها ومع التنبيه المضمَّن في وصف الأداة وفي كل نتيجة. وهذا التنبيه بالذات هو ما ينتهي المساعد إلى قراءته على من طلب كلمة المرور، ولهذا هو موجود.

وإن كنت قادمًا من خوادم MCP أخرى، فمعلومة واحدة: هذا الخادم بلا حالة. يُجاب على الـ POST بـ JSON ولا يُفتح أي تدفق، ولا يُصدر Mcp-Session-Id ولا يُنتظر، ويُجاب على الإشعار بـ 202 بلا جسم، ويعيد الـ GET رمز 405. مواصفة 2025-06-18 تسمح بذلك صراحةً، لكن من يتوقع جلسات وSSE سيصحّح الأخطاء على غير هدى إن لم يخبره أحد.

ما لا تفعله

/v1/check يعيد 501. ليس سهوًا ولا نقطة نهاية نصف مكتملة: هو كذلك عن قصد، والاستجابة نفسها تشرح السبب. إعادة الأرقام نفسها التي يعطيها المدقّق تتطلب محرك الأنماط نفسه الذي يعمل في الموقع، وذلك يكلّف بين 11 مللي ثانية و3.6 ثانية من المعالج لكل طلب بحسب ما يُرسل إليه. وفي خدمة بلا تسجيل وبلا مفتاح، هذا المدى قرار منتج — أين يوضع سقف الطول — ولم يُتخذ بعد. وفي هذه الأثناء يحمل الـ 501 حقل checker_url يشير إلى مدقّق الموقع باللغة التي طلبتها، وهو يفعل هذا بالضبط دون أن يرسل شيئًا.

ولا توجد حسابات ولا مفاتيح ولا خطط. ولأنها غير موجودة، لا يوجد في الواجهة كلها رابط واحد للتسجيل: ولا حتى في خطأ تجاوز الحد، وهو الموضع الذي يضعه فيه الجميع.

الحدود

حدّ واحد، وهو المطبَّق فعلًا: 60 طلبًا في الدقيقة لكل عنوان IP. لا حاجة لتصديق هذه الصفحة: الرقم يسافر داخل كل استجابة، في _meta.limits.burst. وعند تجاوزه يعود 429 مع Retry-After وترويسات RateLimit-*.

وفي _meta سترى أيضًا كتلة quota بقيمتين null. هي المكان المحجوز ليوم تصبح فيه الحسابات موجودة، وتُترك فارغة عن قصد: الحدّ المُعلن وغير المطبَّق أسوأ من عدم إعلان أي حدّ، لأن من يدمج يحترمه ويبرمج تجاه رقم لا يعدّه أحد.

ومع ذلك، فكّر مرتين

الواجهة التي تولّد كلمات المرور هي في جوهرها نمط مضاد: كلمة المرور تسافر عبر الشبكة وتمرّ بجهاز ليس جهازك. وكوننا لا نحفظ شيئًا لا يغيّر شكل المشكلة، بل يغيّر نصيبنا منها فقط — وأنت تعرف أصلًا ما قيمة وعد لا تستطيع التحقّق منه.

لهذا لا يعيش التنبيه في هذه الصفحة وحدها: يسافر في كل استجابة، باللغة التي تطلبها. ولهذا توجد هذه الفقرة هنا لا مخبّأة في آخر التوثيق. أما كلمة المرور التي ستستخدمها أنت، فإن مولّد هذا الموقع يعمل كاملًا داخل متصفحك ولا يرسل شيئًا. الواجهة للأمر الآخر: لما يحدث دون أن يكون أحد أمام الشاشة.

التفاصيل في صفحتين. ما هي الواجهة تحكي لمن هي، وما الذي يستجيب اليوم وما الذي لا يستجيب. والمرجع فيه المعاملات التسعة، وكل الحقول مشروحة واحدًا واحدًا، ورموز الأخطاء والحدود؛ وهو الذي يُفتح بجانب المحرر. وإن كنت تريد أن تقرأه آلة، فهناك openapi.json.


المصادر: الواجهة نفسها، تم التحقق منها مقابل الإنتاج في 31 أغسطس 2026 — POST /v1/generate وPOST /v1/check (501) وPOST /mcp وGET /openapi.json · أرقام التحليل تخرج من المحرك نفسه الذي يستخدمه مولّد ومدقّق password.es · نموذج الهجوم هو 10¹² محاولة في الثانية، دون اتصال وبتجزئة سريعة، وهو نفسه المستخدم في بقية الموقع · خادم MCP ينفّذ مواصفة 2025-06-18 بنقل Streamable HTTP بلا حالة.

صورة بواسطة Stanislav Kondratiev · Pexels

← العودة إلى المدونة