Saltar al contenido principal

Lógica de búsqueda

La idea que se persigue es optimizar la búsqueda y detección de posibles números que puedan representar el número de una tarjeta de crédito (o débito).

Conocemos algunas de las características que debe tener un número de tarjeta de crédito, por ejemplo:

  • Deben tener una longitud de 16 o 19 dígitos
  • Los primeros dígitos (generalmente los 6 primeros) representan el BIN o (Bank Identification Number) que identifica a la entidad emisora de dicha tarjeta
  • El último de los dígitos es un dígito verificador que se calcula mediante el algoritmo Luhn

Cualquier número que cumpla con esas características es potencialmente un número válido de tarjeta, pero también es lo suficientemente genérico como para que encontremos muchos casos que no son en realidad números de tarjetas, como ser por ejemplo partes de identificadores utilizados en sistemas informáticos, e incluso fechas y horas que pueden cumplir con esas características.

Para poder minimizar esos "falsos positivos", vamos a ir agregando filtros que nos permitan descartar la mayor cantidad de casos posibles. Estos fltros se dividen en dos categorías, reglas de patrones que generalmente están asociados a valores de números de tarjetas, y definición de reglas que sabemos ciertamente que son falsos positivos (por ejemplo un identificador del sistema que ya hemos descartado pero que aparece frecuentemente en logs, entonces sabemos que su aparición puede ser descartada).

Niveles de confianza

A cada número encontrado le asignamos un nivel de confianza que va entre 0 y 3, y que es un indicador de cuan probable es que ese número represente un número de tarjeta real.

Cada uno de esos niveles tiene el siguiente significado:

Nivel 0

Es el nivel de confianza más bajo y son números que solamente pasan el chequeo del dígito verificado (Luhn), o sea, no se comprueba que el BIN sea conocido ni que se encuentre en un entorno que contega palabras clave.

Este nivel tiene muchas posibilidades de ser un falso positivo y suelen generar mucho "ruido" en los resultados.

Nivel 1

Este nivel es superior al anterior pero solamente porque hemos encontrado palabras claves asociadas a números de tarjetas en sus inmediaciones, por lo que es más probable que pueda representar un número de tarjeta. Tampoco se chequea el BIN, solo la aparición de palabras clave en su cercanía.

Nivel 2

El número aquí no solamente pasa el chequeo del dígito verificador (Luhn) sino que además sus primeros dígitos se corresponden a un BIN conocido. La lista de BINes conocidos se obtiene de un archivo llamado reveal_binlist.txt si el mismo está presente.

Los BINes pueden definirse con diferentes longitudes, a partir de un solo dígito. Cabe destacar que cuantos más dígitos usemos para el BIN, más específicos vamos a ser y vamos a encontrar menor cantidad de falsos positivos.

Este nivel además asume que no hemos encontrado palabras clave en su entorno, de lo contrario estaríamos en el nivel siguiente.

Nivel 3

Este es el nivel de mayor confianza, donde se cumplen todas las condiciones de comenzar con un BIN conocido, su dígito verificador es correcto, pero además una de las palabras clave se encuentra a la izquierda del valor dentro de una distancia específica. Números con este nivel son los más probables de contener un número de tarjeta válido.

Palabras clave

Existe una lista de palabras clave que, de encontrarse en las inmediaciones del número, incrementan las posibilidades de que ese número sea el de una tarjeta. Si por ejemplo, en la línea donde está el número encontramos la palabra card o pan, es más probable que en esa misma línea se muestre el valor de la tarjeta.

Es importante notar que las palabras clave deben estar antes (a la izquierda) del número, no se consideran si se encuentras detrás (a la derecha) del número.

La lista de palabras clave que se buscan (sin diferenciar mayúsculas de minúsculas) son:

card
pan
field35
field 35
field_35
field-35
f35
f-35
f_35
DE35
DE035
track
visa
master

Distancia

Aquí se introduce el concepto de "distancia", que es la separación máxima en caracteres que separa la palabra clave del valor numérico de la tarjeta, para considerar la palabra clave. Se trata de un valor de "proximidad" para considerar o no dicha palabra clave.

Usando los flags por defecto, la mayor parte de los resultados van a pertenecer a los niveles de confianza 2 (BIN conocido) y 3 (BIN conocido + palabra clave cerca)

Los niveles de confianza 0 y 1 van a aparecer si usamos los flags --bin-length=0 y/o --paranoid.