Un passaporto la cui zona a lettura ottica supera ogni cifra di controllo ispira fiducia. I conti tornano, il validatore restituisce true cinque volte e il flusso di onboarding va avanti. Conviene però essere precisi su cosa significhi quel true, perché promette meno di quanto sembri.
Questa guida è per gli sviluppatori che costruiscono flussi di KYC e onboarding. Divide i controlli di screening più comuni in tre gruppi: cosa intercettano le cifre di controllo della MRZ, cosa non possono intercettare e quale altro controllo copre ogni lacuna. Ogni zona qui sotto è il campione ufficiale di ICAO, Anna Maria Eriksson di "Utopia", o una sua variante inventata per questo articolo. Non compare nessun documento reale.
Questo è il blog di doc.cheap, un'API OCR per passaporti e documenti d'identità. Nulla di quanto segue ne ha bisogno.
A cosa servono le cifre
La MRZ è il blocco di lettere maiuscole, cifre e riempitivi < in fondo alla pagina con la foto del passaporto o sul retro di una carta d'identità. ICAO Doc 9303 le assegna delle cifre di controllo: una per il numero del documento, una per la data di nascita e una per la data di scadenza, una per il numero personale facoltativo nei passaporti e una cifra composita su gran parte della riga inferiore.
Ogni cifra è una somma pesata. Ogni carattere diventa un numero (0–9 valgono sé stessi, da A = 10 fino a Z = 35, < = 0), i numeri vengono moltiplicati per i pesi ripetuti 7, 3, 1 e la somma modulo 10 è la cifra. Come funzionano le cifre di controllo della MRZ lo spiega passo per passo con un validatore pronto da incollare.
Le cifre sono state progettate per intercettare errori di lettura. Non sono mai state pensate per scoprire frodi, e tutto ciò che segue discende da qui.
Cosa intercetta una cifra di controllo
Una singola cifra sbagliata. Poiché 7, 3 e 1 non hanno fattori in comune con 10, cambiare una qualsiasi cifra di un campo con un'altra cifra cambia sempre la somma modulo 10. Un 3 letto come 8, un 5 letto come 6: la cifra del campo non torna più, e nemmeno quella composita.
Quasi tutti gli scambi tra due caratteri vicini. Se due caratteri adiacenti si scambiano di posto, la somma cambia della loro differenza moltiplicata per la differenza dei loro pesi (4, 2 o 6). È un multiplo di 10 solo quando i due valori differiscono di un multiplo di 5. Quindi 98 digitato come 89 viene intercettato, mentre 16 digitato come 61 passa inosservato, così come 05 digitato come 50.
Danni, riflessi e ridigitazione. È qui che le cifre si guadagnano il pane. Una piega su un carattere, un riflesso sulla plastificazione, una persona che ricopia la zona a mano: sono la causa della maggior parte dei dati MRZ sbagliati, e una cifra che non torna è il segnale economico che un campo è stato letto male. La risposta giusta è una nuova foto, non un rifiuto.
Dove l'aritmetica non vede
Le cifre hanno lacune anche per gli errori in buona fede, e un flusso di screening dovrebbe conoscerle.
Una lettera letta come un carattere il cui valore differisce di 10, 20 o 30. Prendete il numero di documento del campione L898902C3, la cui cifra di controllo è 6. Sostituite la C (valore 12) con un 2 (valore 2): la somma scende di 10 × 3 = 30, da 316 a 286, e la cifra resta 6. Anche la composita, che copre gli stessi caratteri con lo stesso peso, continua a passare. Coppie come B e 1, o C e 2, possono scambiarsi senza far rumore.
Campi che nessuna cifra copre. Il nome, lo Stato emittente, la nazionalità e il sesso restano fuori da ogni cifra di campo, e anche la composita salta nazionalità e sesso. Un nome letto male non dà alcun segnale; solo il confronto con la pagina stampata lo rivela.
Cosa non può intercettare affatto
Tutto ciò che è in questa sezione supera le cifre di controllo della MRZ, per costruzione.
Un documento falso con una zona coerente al suo interno. L'algoritmo è pubblico e richiede venti righe di codice. Chiunque produca un documento falso calcola correttamente le cifre, perché una cifra sbagliata è l'unico errore che ogni lettore intercetta gratis. Una zona che passa dice che la zona è stata letta correttamente. Non dice nulla sull'autenticità del documento.
Dati copiati da una persona reale. Una zona costruita con il nome, la data di nascita e il numero di documento reali di qualcun altro ha cifre valide, perché i dati sono veri. Se la persona davanti alla fotocamera sia proprio quella persona è un'altra domanda: un confronto del volto con la foto del documento, una verifica di liveness o un controllo sull'elenco dei documenti smarriti e rubati dell'emittente, se avete accesso a uno.
Un documento scaduto. La data di scadenza 120415 supera la sua cifra di controllo, ed è il 15 aprile 2012. La scadenza è una regola sulle date, non un checksum: confrontate la data con oggi. Ricordate che YYMMDD non ha il secolo, quindi va dedotto dal contesto; il formato data YYMMDD spiega come. Il calcolatore delle cifre di controllo MRZ di questo sito segna come scaduta una data di scadenza passata accanto alle cifre, così vedete le due risposte una accanto all'altra.
Una foto sostituita. La MRZ non contiene né un'immagine né un hash dell'immagine. Una foto sostituita sulla pagina dei dati lascia la zona intatta.
Un chip clonato o alterato. In un passaporto con chip, i gruppi di dati sono firmati dallo Stato emittente, e verificare quella firma (Passive Authentication, ICAO Doc 9303 Part 11) è il modo per sapere che i dati vengono dall'emittente. Servono una lettura NFC e i certificati dell'emittente. Una foto della pagina, per quanto buona, non può rispondere a questa domanda. La MRZ fornisce solo la chiave d'accesso usata per aprire il chip.
Il controllo che molti saltano: la zona contro la pagina
Un documento dice quasi tutto due volte: una nella MRZ e una nella zona di ispezione visiva (VIZ), la pagina stampata che legge una persona. Le due sono prodotte insieme da un unico emittente, quindi su un documento autentico e integro coincidono.
Per questo una discrepanza è più interessante di una cifra che non torna. Una cifra che non torna di solito significa una foto venuta male. Cifre valide accanto a un cognome, una data di nascita o un numero di documento stampati che dicono altro significano che uno dei due lati è stato letto male o modificato dopo la stampa. In entrambi i casi è un documento che deve guardare una persona.
Il confronto va fatto di proposito. Leggete entrambe le zone, normalizzate i valori stampati (date nello stesso formato, nomi ridotti a sole lettere maiuscole) e confrontate campo per campo. Tenete conto della traslitterazione: un Müller stampato può essere MUELLER o MULLER nella zona, a seconda dell'emittente. La pagina dei formati MRZ mostra quali campi porta ciascun layout, e quindi quali si possono confrontare.
Un ordine di screening che regge
- Forma. Numero e lunghezza delle righe decidono tra TD1, TD2 o TD3. Una forma sbagliata è una lettura sbagliata.
- Cifre di controllo. Un errore significa rifare la foto, non rifiutare.
- Zona contro pagina. Una discrepanza con cifre valide va a una persona.
- Date. Scadenza rispetto a oggi; data di nascita rispetto alle vostre regole sull'età.
- Identità. Confronto del volto e liveness, rispetto alla foto del documento.
- Autenticità. Verifica del chip via NFC, oppure controllo degli elementi di sicurezza fisici con un servizio pensato per questo.
I passi da 1 a 4 costano poco e funzionano su qualsiasi immagine. I passi 5 e 6 sono prodotti a sé, e nessuna quantità di aritmetica MRZ li sostituisce.
Dove si colloca doc.cheap
L'API OCR per passaporti di doc.cheap copre i passi da 1 a 4 e riporta con onestà il resto. La sua risposta contiene mrz.status: passed, failed o absent. Con failed, mrz.reason indica cosa non è tornato, una cifra (Check digit failed for: document number) oppure un disaccordo con la pagina stampata (MRZ does not match the visual zone for: surname), perché entrambe le zone vengono lette e confrontate per impostazione predefinita. La zona stessa torna alla lettera in mrz.lines e mrz.text, così potete rifare il calcolo delle cifre nel vostro codice. document.expiry_date, document.is_expired e document.days_remaining rispondono al passo 4.
È un servizio di riconoscimento, non di verifica. Il suo blocco authenticity riporta not_checked invece di lasciar intendere un esito positivo, e i controlli su foto e chip restano agli strumenti fatti per quello. Per provare una zona senza scrivere codice, incollatela nel calcolatore delle cifre di controllo MRZ: gira nel browser e mostra ogni cifra calcolata accanto a quella stampata. Se state scegliendo un servizio in hosting, il confronto tra API OCR per passaporti mette fianco a fianco i prezzi pubblicati.
Una domanda per voi: quale di queste lacune ha incontrato davvero il vostro flusso di onboarding? Raccontatecelo nei commenti qui sotto.