जिस पासपोर्ट का मशीन रीडेबल ज़ोन (MRZ) हर चेक डिजिट पास कर ले, वह भरोसेमंद लगता है। गणित बैठ जाता है, वैलिडेटर पाँच बार true लौटाता है, और ऑनबोर्डिंग फ़्लो आगे बढ़ जाता है। फिर भी यह ठीक-ठीक समझना ज़रूरी है कि उस true का मतलब क्या है, क्योंकि उसका वादा जितना दिखता है उससे छोटा है।

यह प्राइमर उन डेवलपर्स के लिए है जो KYC (Know Your Customer) और ऑनबोर्डिंग फ़्लो बनाते हैं। यह आम स्क्रीनिंग जाँचों को तीन हिस्सों में बाँटती है: MRZ के चेक डिजिट क्या पकड़ते हैं, क्या नहीं पकड़ सकते, और हर कमी को कौन-सी दूसरी जाँच पूरा करती है। नीचे का हर ज़ोन ICAO का अपना नमूना है, "Utopia" की Anna Maria Eriksson, या इस पोस्ट के लिए गढ़ा गया उसका कोई रूप। कोई वास्तविक दस्तावेज़ शामिल नहीं है।

यह doc.cheap का ब्लॉग है, जो एक पासपोर्ट और ID OCR API है। नीचे की किसी चीज़ को इसकी ज़रूरत नहीं।

डिजिट किसलिए हैं

MRZ बड़े अक्षरों, अंकों और < फ़िलर का वह ब्लॉक है जो पासपोर्ट के फ़ोटो पेज के नीचे या ID कार्ड के पीछे होता है। ICAO Doc 9303 इसे चेक डिजिट देता है: दस्तावेज़ संख्या, जन्म तिथि और समाप्ति तिथि के लिए एक-एक, पासपोर्ट के वैकल्पिक व्यक्तिगत नंबर के लिए एक, और निचली लाइन के ज़्यादातर हिस्से पर एक कंपोज़िट डिजिट।

हर डिजिट एक भारित योग (weighted sum) है। हर कैरेक्टर एक संख्या बनता है (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 चेक डिजिट पास कर लेती है।

अंदर से सुसंगत ज़ोन वाला जाली दस्तावेज़। एल्गोरिदम सार्वजनिक है और बीस लाइन के कोड में आ जाता है। जो भी नकली दस्तावेज़ बनाता है, वह डिजिट सही गिनता है, क्योंकि ग़लत डिजिट ही वह एक ग़लती है जिसे हर रीडर मुफ़्त में पकड़ लेता है। पास होता ज़ोन बताता है कि ज़ोन सही पढ़ा गया। वह इस बारे में कुछ नहीं कहता कि दस्तावेज़ असली है या नहीं।

किसी असली व्यक्ति से कॉपी किया गया डेटा। किसी और के असली नाम, जन्म तिथि और दस्तावेज़ नंबर से बने ज़ोन के डिजिट सही होते हैं, क्योंकि डेटा असली है। कैमरे के सामने खड़ा व्यक्ति वही है या नहीं, यह अलग सवाल है: दस्तावेज़ की फ़ोटो से चेहरे का मिलान, लाइवनेस चेक, या अगर आपके पास पहुँच हो तो जारीकर्ता की खोए और चोरी हुए दस्तावेज़ों की सूची से जाँच।

समाप्त हो चुका दस्तावेज़। समाप्ति तिथि 120415 अपना चेक डिजिट पास करती है, और वह 15 अप्रैल 2012 है। एक्सपायरी तारीख़ों का नियम है, चेकसम नहीं: तारीख़ को आज से मिलाइए। याद रखें कि YYMMDD में सदी नहीं होती, इसलिए उसे संदर्भ से तय करें; YYMMDD तारीख़ फ़ॉर्मैट बताता है कैसे। इस साइट का MRZ चेक डिजिट कैलकुलेटर बीत चुकी समाप्ति तिथि को डिजिट के बगल में expired दिखाता है, ताकि आप दोनों जवाब साथ-साथ देख सकें।

बदली गई फ़ोटो। MRZ में न कोई तस्वीर होती है, न तस्वीर का हैश। डेटा पेज पर बदली गई फ़ोटो ज़ोन को छूती भी नहीं।

क्लोन की गई या बदली गई चिप। चिप वाले पासपोर्ट में डेटा ग्रुप जारी करने वाले देश द्वारा साइन किए जाते हैं, और उस सिग्नेचर को जाँचना (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 का पासपोर्ट OCR API कदम 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 चेक डिजिट कैलकुलेटर में पेस्ट करें; यह ब्राउज़र में चलता है और हर गिना गया डिजिट छपे डिजिट के बगल में दिखाता है। अगर आप कोई होस्टेड सेवा चुन रहे हैं, तो पासपोर्ट OCR API तुलना प्रकाशित क़ीमतें साथ-साथ रखती है।

आपसे एक सवाल: आपके ऑनबोर्डिंग फ़्लो का सामना असल में इनमें से किस कमी से हुआ है? नीचे कमेंट में बताइए।