Tal y como se explicó hace algunos años en el artículo “¿Cómo funcionan las tarjetas de pago? Parte I: PAN (Primary Account Number)“, el PAN de una tarjeta está conformado por una serie de dígitos (por lo general 16) con una estructura definida:

Este artículo describirá la importancia del último dígito del PAN, conocido como “dígito de verificación” (“check digit”), valor que permite identificar si un número de tarjeta de pago es válido o no. Antes de proceder, es importante tener en cuenta que el algoritmo de Luhn permite comprobar si una secuencia de dígitos corresponde a un número de tarjeta (PAN) válido, sin que ello implique que dicha tarjeta sea operativa o que pueda ser usada en transacciones comerciales, labor que corresponde al centro autorizador.

Historia

Con el fin de validar posibles errores a la hora de la transcripción de una secuencia de números (cambiar un número por otro o identificar posibles intercambios de dígitos), el ingeniero informático Hans Peter Luhn, que trabajaba para IBM,  diseñó en 1954 un algoritmo basado en el principio del módulo aritmético (suma matemática mod-10) que permitía la identificación de posibles errores durante la digitación o transmisión de una una cantidad considerable de números entre una fuente y otra (por ejemplo, durante la digitación de un número de tarjeta por una persona en un formulario web o en su escritura en un papel). Su algoritmo se conoce como “algoritmo o fórmula de Luhn” o “algoritmo de módulo 10”.

Hans Peter Luhn

Obviamente, una de las aplicaciones principales de este algoritmo se encuentra en la identificación de errores de digitación del PAN de las tarjetas de pago (definido en el estándar ISO/IEC 7812-1:2006 Identification cards — Identification of issuers — Part 1: Numbering system).

A pesar de su facilidad de implementación, el algoritmo no ofrece confiabilidad total en el caso de intercambio de dos cifras contiguas (por ejemplo 12 con 21), razón por la cual la fórmula ha sido optimizada en algoritmos más recientes como es el caso del algoritmo de Verhoeff y el algoritmo de Damm.

Generación del dígito de verificación a través del algoritmo de Luhn

Para generar el dígito de verificación empleando el algoritmo de Luhn se deben seguir estos pasos:

  1. En una secuencia de dígitos dada, el dígito de verificación será el último valor, que en principio se desconoce
  2. Partiendo de esa última posición, se multiplica cada dígito de posición par (contando desde la derecha) por dos. Si el resultado es un número de dos dígitos, entonces se suman estos dos valores
  3. Posteriormente, se suman todos los dígitos obtenidos
  4. El dígito de verificación es el número que se obtiene como residuo después de dividir ese resultado entre 10 (que es lo que en matemáticas se denomina mod-10). En otras palabras, el dígito de verificación es el número que debe agregarse a este resultado para hacer el siguiente múltiplo de 10.

Generación del dígito de verificación empleando el algoritmo de Luhn

Validación de un número de tarjeta empleando el algoritmo de Luhn

Cuando se cuenta con una secuencia de dígitos y se quiere saber si esos números corresponden o no a un posible número de tarjeta de pago (PAN), se aplica el algoritmo de Luhn cuyo resultado debe ser 0 (cero) si esa secuencia es válida. En este caso, los pasos a seguir son los mismos que en la generación, sólo que esta vez se tiene en cuenta el último dígito de la secuencia dentro de las operaciones aditivas. Para este ejemplo se usará la secuencia con el dígito de verificación generado anteriormente:

Validación de un número de tarjeta empleando el algoritmo de Luhn

Como se puede observar, la secuencia es considerada válida ya que el resultado de la operación mod-10 es igual a cero.

El siguiente caso analiza otra secuencia de 16 dígitos para identificar si es un número de tarjeta válido o no:

Validación de un número de tarjeta empleando el algoritmo de Luhn

En este caso, el resultado de mod-10 es igual a 1, por lo que la secuencia corresponde a un número de tarjeta inválido.

Escenarios de aplicación del algoritmo de Luhn en entornos PCI DSS

El algoritmo de Luhn puede ser empleado para la validación del código IMEI de teléfonos móviles, números de identificación personal, números de seguridad social, etc. No obstante, su principal uso se encuentra en la identificación de la validez de datos del PAN de una tarjeta de pago. En entornos PCI DSS esta labor es de vital importancia en el cumplimiento de los siguientes controles:

  • Validar que en entornos de pruebas y/o de desarrollo no se usan datos de PAN reales (req. 6.4.3)  mediante el análisis de los datos de tarjetas empleados por los desarrolladores y su validación con el algoritmo de Luhn.
  • Validar que no existen datos de PAN reales almacenados en texto claro (req. 3.4) en logs, ficheros de depuración, bases de datos, etc. Esto se puede llevar a cabo analizando los resultados de herramientas de búsqueda de datos de PAN y validándolos con el algoritmo de Luhn.
  • Implementar alertas en sistemas de detección de intrusos (IDS) si se identifican secuencias de números en el tráfico de red analizado (req. 11.5). Un ejemplo con SNORT se puede encontrar aquí.
  • Validar que no se emplean canales de mensajería instantánea para el envío de datos de PAN, como por ejemplo a través del correo electrónico (Req. 4.2). Un ejemplo con Office 365 se puede encontrar aquí.
  • Implementar una metodología de descubrimiento de datos para confirmar el alcance de PCI DSS, respuesta ante incidentes y mecanismos para la detección y prevención de exfiltración del PAN en canales no autorizados (Req. A3.2.5.x y A3.2.6.x del Anexo 3 de PCI DSS para entidades designadas (DES))

Otros posibles usos del algoritmo de Luhn son:

  • Si el entorno emplea tokenización basada en Format Preserving Tokenization (FPT) en la cual el token tiene el mismo formato del PAN (16 dígitos) pero se quiere distinguir si una secuencia de dígitos en particular es un PAN real o un token, se puede emplear el algoritmo de Luhn
  • En un formulario web de ingreso de datos de tarjeta, para validar si el PAN digitado por el cliente final es un PAN correcto o no, se puede emplear el algoritmo de Luhn a través de componentes JavaScript, evitando de esta manera que se envíen datos inválidos al centro autorizador
  • Si se emplean soluciones de DLP (Data Loss Prevention), se pueden configurar reglas específicas para identificar su una secuencia de dígitos corresponde o no a un dato de PAN empleando el algoritmo de Luhn.

Si conoces más aplicaciones de este algoritmo, no olvides dejarnos tus comentarios en este post. Adicionalmente, si tienes dudas, puedes escribirnos en el foro o en  Twitter, LinkedIn, Facebook o Google+ y no olvides seguirnos vía RSS.