جواز السفر الذي تجتاز منطقة القراءة الآلية فيه (MRZ، اختصار Machine Readable Zone) كل أرقام التحقق يبدو جديرًا بالثقة. الحساب صحيح، والمدقق يعيد true خمس مرات، ومسار التسجيل يمضي قُدمًا. لكن من المفيد أن نكون دقيقين في معنى هذه القيمة true، لأنها وعد أصغر مما يبدو.

هذا الدليل موجّه للمطورين الذين يبنون مسارات KYC (اعرف عميلك) والتسجيل. يقسّم فحوص التدقيق المعتادة إلى ثلاث فئات: ما تكشفه أرقام التحقق في MRZ، وما لا تستطيع كشفه، وأي فحص آخر يسدّ كل ثغرة. كل منطقة أدناه هي عيّنة ICAO نفسها، Anna Maria Eriksson من "Utopia"، أو نسخة معدّلة منها اختُلقت لهذا المقال. لا تظهر أي وثيقة حقيقية.

هذه مدونة doc.cheap، وهي واجهة API للتعرّف على جوازات السفر وبطاقات الهوية. لا شيء مما يلي يحتاج إليها.

ما الغرض من الأرقام

منطقة MRZ هي كتلة الحروف الكبيرة والأرقام ومحارف الحشو < في أسفل صفحة الصورة في جواز السفر أو على ظهر بطاقة الهوية. تمنحها وثيقة ICAO Doc 9303 أرقام تحقق: رقمًا لكل من رقم الوثيقة وتاريخ الميلاد وتاريخ انتهاء الصلاحية، ورقمًا للرقم الشخصي الاختياري في جوازات السفر، ورقمًا مركّبًا يغطي معظم السطر السفلي.

كل رقم هو مجموع موزون. يتحول كل محرف إلى عدد (0–9 بقيمتها نفسها، ومن A = 10 حتى Z = 35، و< = 0)، وتُضرب الأعداد في الأوزان المتكررة 7 و3 و1، وباقي قسمة المجموع على 10 هو الرقم. يشرح مقال كيف تعمل أرقام التحقق في MRZ ذلك خطوة بخطوة مع مدقق جاهز للنسخ.

صُممت الأرقام لكشف أخطاء القراءة. لم يكن الغرض منها قط اكتشاف الاحتيال، وكل ما يلي ينبع من هذه الحقيقة.

ما الذي يكشفه رقم التحقق

رقم واحد خاطئ. لأن 7 و3 و1 لا تشترك مع 10 في أي عامل، فإن تغيير أي رقم في حقل إلى رقم آخر يغيّر دائمًا باقي قسمة المجموع على 10. رقم 3 قُرئ 8، أو 5 قُرئ 6: يتوقف رقم الحقل عن التطابق، ومعه الرقم المركّب.

معظم التبديلات بين محرفين متجاورين. إذا تبادل محرفان متجاوران مكانيهما، يتغير المجموع بمقدار الفرق بين قيمتيهما مضروبًا في الفرق بين وزنيهما (4 أو 2 أو 6). ولا يكون ذلك مضاعفًا لـ 10 إلا حين يكون الفرق بين القيمتين مضاعفًا لـ 5. لذلك يُكشف 98 المكتوب 89، بينما يمرّ 16 المكتوب 61 دون أن يُلاحظ، وكذلك 05 المكتوب 50.

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

حيث يعجز الحساب

للأرقام ثغرات حتى في الأخطاء غير المقصودة، وينبغي لمسار التدقيق أن يعرفها.

حرف يُقرأ محرفًا تختلف قيمته بمقدار 10 أو 20 أو 30. خذ رقم الوثيقة في العيّنة L898902C3، ورقم تحققه 6. استبدل C (قيمته 12) بـ 2 (قيمته 2): ينخفض المجموع بمقدار 10 × 3 = 30، من 316 إلى 286، ويبقى الرقم 6. والرقم المركّب، الذي يغطي المحارف نفسها بالوزن نفسه، يبقى ناجحًا أيضًا. أزواج مثل B و1، أو C و2، يمكن أن تتبادل دون أي إنذار.

حقول لا يغطيها أي رقم. الاسم والدولة المُصدِرة والجنسية والجنس تقع خارج كل أرقام الحقول، والرقم المركّب يتخطى الجنسية والجنس أيضًا. الاسم المقروء خطأً لا يُطلق أي إنذار؛ وحدها المقارنة بالصفحة المطبوعة تكشفه.

ما لا يمكنه كشفه إطلاقًا

كل ما في هذا القسم يجتاز أرقام التحقق في MRZ بحكم بنيته.

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

بيانات منسوخة من شخص حقيقي. المنطقة المبنية من الاسم الحقيقي لشخص آخر وتاريخ ميلاده ورقم وثيقته لها أرقام صحيحة، لأن البيانات حقيقية. أما هل الشخص الذي أمام الكاميرا هو ذلك الشخص فعلًا فسؤال مختلف: مطابقة الوجه مع صورة الوثيقة، أو فحص الحيوية (liveness)، أو التحقق من قائمة الوثائق المفقودة والمسروقة لدى الجهة المُصدِرة إن كان لديك وصول إليها.

وثيقة منتهية الصلاحية. تاريخ الانتهاء 120415 يجتاز رقم تحققه، وهو 15 أبريل 2012. انتهاء الصلاحية قاعدة تخص التواريخ، لا مجموعًا اختباريًا: قارن التاريخ بتاريخ اليوم. وتذكّر أن صيغة YYMMDD لا تحمل القرن، فحدّده من السياق؛ يشرح مقال صيغة التاريخ YYMMDD كيف. وتضع حاسبة أرقام التحقق في MRZ على هذا الموقع علامة "منتهي الصلاحية" على تاريخ الانتهاء الماضي بجانب الأرقام، فترى الإجابتين جنبًا إلى جنب.

صورة مستبدلة. لا تحمل منطقة MRZ أي صورة ولا أي بصمة (hash) لصورة. الصورة المستبدلة في صفحة البيانات تترك المنطقة كما هي.

شريحة مستنسخة أو معدّلة. في جواز السفر المزوّد بشريحة، تكون مجموعات البيانات موقّعة من الدولة المُصدِرة، والتحقق من هذا التوقيع (Passive Authentication، ICAO Doc 9303 Part 11) هو الطريقة لمعرفة أن البيانات صادرة عن الجهة المُصدِرة. يتطلب ذلك قراءة عبر NFC وشهادات الجهة المُصدِرة. صورة الصفحة، مهما كانت جيدة، لا تستطيع الإجابة عن ذلك. منطقة MRZ تقدّم فقط مفتاح الوصول المستخدم لفتح الشريحة.

الفحص الذي يتخطاه الناس: المنطقة مقابل الصفحة

تقول الوثيقة معظم الأشياء مرتين: مرة في MRZ ومرة في منطقة الفحص البصري (VIZ)، أي الصفحة المطبوعة التي يقرؤها الإنسان. تُنتَج الاثنتان معًا من جهة إصدار واحدة، لذا تتطابقان في الوثيقة الأصلية السليمة.

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

يجب إجراء المقارنة عن قصد. اقرأ المنطقتين، ووحّد القيم المطبوعة (التواريخ بالصيغة نفسها، والأسماء مختصرة إلى حروف كبيرة مجردة)، وقارن حقلًا بحقل. وراعِ النقل الحرفي: Müller المطبوع قد يكون MUELLER أو MULLER في المنطقة، بحسب الجهة المُصدِرة. تعرض صفحة صيغ MRZ الحقول التي يحملها كل تخطيط، وبالتالي الحقول التي يمكن مقارنتها.

ترتيب تدقيق يصمد

  1. الشكل. عدد الأسطر وطولها يحددان TD1 أو TD2 أو TD3. الشكل الخاطئ قراءة سيئة.
  2. أرقام التحقق. الفشل يعني إعادة التصوير، لا الرفض.
  3. المنطقة مقابل الصفحة. عدم التطابق مع أرقام ناجحة يُحال إلى إنسان.
  4. التواريخ. تاريخ الانتهاء مقابل اليوم؛ وتاريخ الميلاد مقابل قواعد العمر لديك.
  5. الهوية. مطابقة الوجه وفحص الحيوية، مقابل صورة الوثيقة.
  6. الأصالة. التحقق من الشريحة عبر NFC، أو فحص عناصر الأمان المادية بخدمة مصممة لذلك.

الخطوات من 1 إلى 4 رخيصة وتعمل على أي صورة. الخطوتان 5 و6 منتجان منفصلان، ولا يعوّض عنهما أي قدر من حساب MRZ.

أين يقع doc.cheap

تغطي واجهة doc.cheap للتعرّف على جوازات السفر الخطوات من 1 إلى 4، وتقدّم تقريرًا صادقًا عن البقية. تحمل استجابتها mrz.status: passed أو failed أو absent. عند failed يذكر mrz.reason ما الذي لم يتطابق، إما رقم (Check digit failed for: document number) وإما اختلاف مع الصفحة المطبوعة (MRZ does not match the visual zone for: surname)، لأن المنطقتين تُقرآن وتُقارنان افتراضيًا. وتعود المنطقة نفسها حرفيًا في mrz.lines وmrz.text، فيمكنك إعادة حساب الأرقام في شيفرتك. وتجيب document.expiry_date وdocument.is_expired وdocument.days_remaining عن الخطوة 4.

إنها خدمة تعرّف، لا خدمة تحقق. كتلة authenticity فيها تقول not_checked بدل أن توحي بالنجاح، وتبقى فحوص الصورة والشريحة للأدوات المصممة لها. لتجربة منطقة دون أي شيفرة، الصقها في حاسبة أرقام التحقق في MRZ؛ تعمل داخل المتصفح وتعرض كل رقم محسوب بجانب الرقم المطبوع. وإن كنت تختار خدمة مستضافة، فإن مقارنة واجهات API للتعرّف على جوازات السفر تضع الأسعار المنشورة جنبًا إلى جنب.

سؤال لك: أي هذه الثغرات واجهها مسار التسجيل لديك في الواقع؟ أخبرنا في التعليقات أدناه.