1001Ferramentas
Validadores

Validador Luhn (genérico)

Valida qualquer sequência numérica pelo algoritmo Luhn (mod 10) — usado em cartões de crédito, IMEI, ICCID e outros identificadores. Mostra dígito verificador.

O algoritmo de Luhn: a patente IBM de 1960 que protege metade do mundo digital

O algoritmo de Luhn — também chamado de modulo 10 ou mod 10 — e um checksum simples que detecta quase todo erro acidental de dígito único em um identificador numérico. Inventado pelo cientista da IBM Hans Peter Luhn e patenteado em 1960 (patente americana 2.950.048), caiu em domínio público ha décadas e virou o checksum de fato para cartões de crédito, IMEI, SIN canadense, NPI americano e dezenas de outros esquemas que precisam de verificação de integridade barata e offline.

Apesar da idade, o Luhn segue sendo a ferramenta certa sempre que o objetivo e pegar erros de digitação e leitura — não autenticar nem detectar adulteracao maliciosa. Ele não e, intencionalmente, um hash criptografico: um atacante determinado consegue forjar quantas sequências validas quiser. O trabalho do checksum e impedir o caixa de errar um dígito do número do cartão ou o scanner OCR de ler errado um IMEI.

O algoritmo em quatro passos

  1. A partir do dígito mais a direita, dobre cada segundo dígito.
  2. Se o valor dobrado passar de 9, subtraia 9 (equivale a somar seus dois dígitos).
  3. Some todos os dígitos transformados, incluindo o último a direita que nunca e dobrado.
  4. A sequência e valida se o total for múltiplo de 10.

Exemplo sobre 79927398713: pela direita, os dígitos em posição par são 1, 8, 3, 2, 9; dobrados e reduzidos viram 2, 7, 6, 4, 9; somados aos intocados 3, 7, 9, 7, 9, 7 o total e 70; 70 mod 10 = 0; válido.

Implementação de referência em JavaScript

function luhn(str) {
  let sum = 0, alt = false;
  for (let i = str.length - 1; i >= 0; i--) {
    let n = parseInt(str[i], 10);
    if (alt) { n *= 2; if (n > 9) n -= 9; }
    sum += n;
    alt = !alt;
  }
  return sum % 10 === 0;
}

Libs de produção que ja trazem um Luhn testado em larga escala: validator.isCreditCard, card-validator, o pacote npm creditcards e o Apache Commons LuhnCheckDigit em Java. Elas acrescentam detecção de bandeira (faixas de BIN) sobre o checksum bruto.

Onde o Luhn e usado (e onde não)

  • Cartões de crédito e debito: Visa, Mastercard, American Express, Discover, JCB, UnionPay, Diners — toda bandeira do planeta usa Luhn no PAN.
  • IMEI: identificador de aparelho movel de 15 dígitos.
  • SIN canadense (Social Insurance Number) — 9 dígitos.
  • NPI americano (National Provider Identifier) — IDs de prestadores de saúde.
  • ID sul-africano, AMKA grego, Teudat Zehut israelense.
  • Não e usado em CPF, CNPJ ou PIS brasileiros: eles usam modulo 11, que pega uma classe maior de erros ao preço de produzir um X para resto 10.

O que o Luhn NÃO pega

Mod 10 não e a prova de balas. Especificamente:

  • Erros gemeos: 22 -> 33, 44 -> 55 — mesmo dígito trocado duas vezes produz o mesmo checksum. O Luhn perde cerca de 1,7 por cento deles.
  • Transposicoes específicas: trocar 09 por 90 e algumas outras passam batido.
  • Existência: um PAN válido no Luhn pode estar não emitido, vencido, bloqueado ou furtado. O PCI-DSS proibe armazenar o PAN completo no client mesmo depois de passar no Luhn.
  • Autenticidade: kits de phishing imprimem números válidos no Luhn trivialmente — nunca use o checksum como único sinal de fraude.

Para verificação real de cartão, combine o BIN (primeiros 6 dígitos) + últimos 4 + AVS + 3D Secure + tokenizacao no adquirente. A etapa Luhn e somente uma proteção client-side contra digitação errada.

FAQ

O algoritmo Luhn pega todo erro de digitação? Não. Pega toda substituição de dígito único e a maioria das transposicoes adjacentes, mas perde erros gemeos e algumas trocas raras. Empiricamente filtra cerca de 95 por cento dos erros acidentais.

O Luhn e usado em CPF? Não. CPF, CNPJ e PIS usam modulo 11 com dois dígitos verificadores, que pega uma classe maior de erros ao custo de eventualmente produzir resto 10 (tratado como 0 em CPF/CNPJ e como X no ISBN-10).

Quais bandeiras de cartão usam Luhn? Todas — Visa, Mastercard, American Express, Discover, JCB, UnionPay, Diners, Hipercard, Elo e assim por diante. A bandeira e identificada pelo BIN (primeiros 6 dígitos), não pelo checksum.

Posso gerar um número válido no Luhn? Sim — por definição, todo prefixo de 14 dígitos admite exatamente um último dígito que fecha o checksum. Por isso o Luhn sozinho nunca e defesa contra fraude.

A patente Luhn ainda esta vigente? Não. A US 2.950.048 foi depositada em 1954, concedida em 1960 e expirou em 1977. O algoritmo esta em domínio público ha quase meio seculo.

Ferramentas Relacionadas