Un pasaporte cuya zona de lectura mecánica supera todos los dígitos de control inspira confianza. La aritmética cuadra, el validador devuelve true cinco veces y el flujo de alta sigue adelante. Conviene precisar qué significa ese true, porque promete menos de lo que parece.
Esta guía es para desarrolladores que construyen flujos de KYC y de alta de clientes. Clasifica las comprobaciones habituales en lo que detectan los dígitos de control de la MRZ, lo que no pueden detectar y qué otra comprobación cubre cada hueco. Todas las zonas de abajo son el propio espécimen de ICAO, Anna Maria Eriksson de "Utopia", o una variante inventada para este artículo. No aparece ningún documento real.
Este es el blog de doc.cheap, una API de OCR para pasaportes y documentos de identidad. Nada de lo que sigue la necesita.
Para qué sirven los dígitos
La MRZ es el bloque de mayúsculas, dígitos y caracteres de relleno < al pie de la página de datos del pasaporte o en el reverso de un documento de identidad. ICAO Doc 9303 le asigna dígitos de control: uno para el número de documento, otro para la fecha de nacimiento y otro para la fecha de caducidad, uno para el número personal opcional de los pasaportes y un dígito compuesto sobre casi toda la línea inferior.
Cada dígito es una suma ponderada. Cada carácter se convierte en un número (0–9 valen lo que son, A = 10 hasta Z = 35, < = 0), los números se multiplican por los pesos 7, 3, 1, que se repiten, y la suma módulo 10 es el dígito. Cómo funcionan los dígitos de control de la MRZ lo explica paso a paso con un validador que puedes copiar.
Los dígitos se diseñaron para detectar errores de lectura. Nunca pretendieron detectar fraude, y todo lo que sigue se deriva de ahí.
Qué detecta un dígito de control
Un único dígito erróneo. Como 7, 3 y 1 no comparten ningún factor con 10, cambiar cualquier dígito de un campo por otro dígito siempre cambia la suma módulo 10. Un 3 leído como 8, un 5 leído como 6: el dígito del campo deja de cuadrar, y el compuesto también.
Casi todos los intercambios de dos vecinos. Si dos caracteres contiguos se intercambian, la suma cambia en su diferencia multiplicada por la diferencia de sus pesos (4, 2 o 6). Eso es múltiplo de 10 solo cuando los dos valores difieren en un múltiplo de 5. Así, 98 tecleado como 89 se detecta, mientras que 16 tecleado como 61 pasa desapercibido, igual que 05 tecleado como 50.
Daños, reflejos y retecleo. Aquí es donde los dígitos se ganan el sueldo. Un pliegue sobre un carácter, un reflejo en el laminado, una persona que vuelve a teclear una zona a mano: esto causa la mayoría de los datos de MRZ erróneos, y un dígito fallido es la señal barata de que un campo se leyó mal. La respuesta correcta es una foto nueva, no un rechazo.
Donde la aritmética no ve
Los dígitos tienen huecos incluso ante errores honestos, y un flujo de cribado debería conocerlos.
Una letra leída como un carácter cuyo valor difiere en 10, 20 o 30. Toma el número de documento del espécimen, L898902C3, cuyo dígito de control es 6. Sustituye la C (valor 12) por un 2 (valor 2): la suma baja 10 × 3 = 30, de 316 a 286, y el dígito sigue siendo 6. El compuesto, que cubre los mismos caracteres con el mismo peso, también sigue cuadrando. Pares como B y 1, o C y 2, pueden sustituirse uno por otro sin hacer ruido.
Campos que ningún dígito cubre. El nombre, el Estado emisor, la nacionalidad y el sexo quedan fuera de todos los dígitos de campo, y el compuesto también omite la nacionalidad y el sexo. Un nombre mal leído pasa en silencio; solo una comparación con la página impresa lo revela.
Lo que no puede detectar en absoluto
Todo lo de esta sección supera los dígitos de control de la MRZ, por construcción.
Un documento falsificado con una zona coherente. El algoritmo es público y cabe en veinte líneas de código. Quien fabrica un documento falso calcula bien los dígitos, porque un dígito erróneo es el único fallo que cualquier lector detecta gratis. Una zona que cuadra dice que la zona se leyó bien. No dice nada sobre si el documento es auténtico.
Datos copiados de una persona real. Una zona construida con el nombre, la fecha de nacimiento y el número de documento reales de otra persona tiene dígitos válidos, porque los datos son reales. Si la persona que está ante la cámara es esa persona es otra cuestión: una comparación facial con la foto del documento, una prueba de vida o una consulta a la lista de documentos perdidos y robados de un emisor, si tienes acceso a una.
Un documento caducado. La fecha de caducidad 120415 supera su dígito de control, y es el 15 de abril de 2012. La caducidad es una norma sobre fechas, no una suma de control: compara la fecha con la de hoy. Recuerda que YYMMDD no lleva siglo, así que decídelo por el contexto; el formato de fecha YYMMDD explica cómo. La calculadora de dígitos de control de la MRZ de este sitio marca una fecha de caducidad pasada como caducada junto a los dígitos, para que veas ambas respuestas una al lado de la otra.
Una foto sustituida. La MRZ no lleva imagen ni hash de imagen. Una foto cambiada en la página de datos deja la zona intacta.
Un chip clonado o alterado. En un pasaporte con chip, los grupos de datos están firmados por el Estado emisor, y verificar esa firma (Passive Authentication, ICAO Doc 9303 Parte 11) es la forma de saber que los datos vienen del emisor. Eso exige una lectura NFC y los certificados del emisor. Una foto de la página, por buena que sea, no puede responderlo. La MRZ solo aporta la clave de acceso con la que se abre el chip.
La comprobación que todos se saltan: la zona frente a la página
Un documento dice casi todo dos veces: una en la MRZ y otra en la zona de inspección visual (VIZ), la página impresa que lee una persona. Las dos las produjo a la vez un mismo emisor, así que en un documento auténtico y sin daños coinciden.
Por eso una discrepancia es más interesante que un dígito fallido. Un dígito fallido suele indicar una mala foto. Dígitos que cuadran junto a un apellido, una fecha de nacimiento o un número de documento impresos que dicen otra cosa indican que uno de los dos lados se leyó mal o se modificó después de imprimirse. En cualquier caso, es un documento que debe revisar una persona.
La comparación hay que hacerla a propósito. Lee ambas zonas, normaliza los valores impresos (las fechas en la misma forma, los nombres reducidos a mayúsculas sin más) y compara campo por campo. Ten en cuenta la transliteración: un Müller impreso puede ser MUELLER o MULLER en la zona, según el emisor. La página de formatos de MRZ muestra qué campos lleva cada formato y, por tanto, cuáles se pueden comparar.
Un orden de cribado que se sostiene
- Forma. El número y la longitud de las líneas deciden si es TD1, TD2 o TD3. Una forma errónea es una mala lectura.
- Dígitos de control. Un fallo significa repetir la foto, no rechazar.
- Zona frente a página. Una discrepancia con dígitos que cuadran pasa a una persona.
- Fechas. La caducidad frente a hoy; la fecha de nacimiento frente a tus normas de edad.
- Identidad. Comparación facial y prueba de vida frente a la foto del documento.
- Autenticidad. Verificación del chip por NFC, o elementos de seguridad físicos comprobados por un servicio hecho para ello.
Los pasos 1 a 4 son baratos y funcionan con cualquier imagen. Los pasos 5 y 6 son productos aparte, y ninguna cantidad de aritmética de la MRZ los sustituye.
Dónde encaja doc.cheap
La API de OCR de pasaportes de doc.cheap cubre los pasos 1 a 4 e informa con honestidad sobre el resto. Su respuesta incluye mrz.status: passed, failed o absent. Con failed, mrz.reason indica qué no cuadró, ya sea un dígito (Check digit failed for: document number) o una discrepancia con la página impresa (MRZ does not match the visual zone for: surname), porque por defecto se leen y se comparan ambas zonas. La zona en sí vuelve tal cual en mrz.lines y mrz.text, para que puedas recalcular los dígitos en tu propio código. document.expiry_date, document.is_expired y document.days_remaining responden al paso 4.
Es un servicio de reconocimiento, no de verificación. Su bloque authenticity indica not_checked en lugar de dar a entender un aprobado, y las comprobaciones de foto y de chip quedan para las herramientas hechas para ellas. Para probar una zona sin escribir código, pégala en la calculadora de dígitos de control de la MRZ; funciona en el navegador y muestra cada dígito calculado junto al impreso. Si estás eligiendo un servicio alojado, la comparativa de APIs de OCR de pasaportes pone los precios publicados uno al lado del otro.
Una pregunta para ti: ¿con cuál de estos huecos se ha topado ya tu flujo de alta en la práctica? Cuéntanoslo en los comentarios de abajo.