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 — tambem chamado de modulo 10 ou mod 10 — e um checksum simples que detecta quase todo erro acidental de digito unico em um identificador numerico. Inventado pelo cientista da IBM Hans Peter Luhn e patenteado em 1960 (patente americana 2.950.048), caiu em dominio publico ha decadas e virou o checksum de fato para cartoes de credito, IMEI, SIN canadense, NPI americano e dezenas de outros esquemas que precisam de verificacao de integridade barata e offline.

Apesar da idade, o Luhn segue sendo a ferramenta certa sempre que o objetivo e pegar erros de digitacao e leitura — nao autenticar nem detectar adulteracao maliciosa. Ele nao e, intencionalmente, um hash criptografico: um atacante determinado consegue forjar quantas sequencias validas quiser. O trabalho do checksum e impedir o caixa de errar um digito do numero do cartao ou o scanner OCR de ler errado um IMEI.

O algoritmo em quatro passos

  1. A partir do digito mais a direita, dobre cada segundo digito.
  2. Se o valor dobrado passar de 9, subtraia 9 (equivale a somar seus dois digitos).
  3. Some todos os digitos transformados, incluindo o ultimo a direita que nunca e dobrado.
  4. A sequencia e valida se o total for multiplo de 10.

Exemplo sobre 79927398713: pela direita, os digitos em posicao par sao 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; valido.

Implementacao de referencia 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 producao 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 deteccao de bandeira (faixas de BIN) sobre o checksum bruto.

Onde o Luhn e usado (e onde nao)

  • Cartoes de credito 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 digitos.
  • SIN canadense (Social Insurance Number) — 9 digitos.
  • NPI americano (National Provider Identifier) — IDs de prestadores de saude.
  • ID sul-africano, AMKA grego, Teudat Zehut israelense.
  • Nao e usado em CPF, CNPJ ou PIS brasileiros: eles usam modulo 11, que pega uma classe maior de erros ao preco de produzir um X para resto 10.

O que o Luhn NAO pega

Mod 10 nao e a prova de balas. Especificamente:

  • Erros gemeos: 22 -> 33, 44 -> 55 — mesmo digito trocado duas vezes produz o mesmo checksum. O Luhn perde cerca de 1,7 por cento deles.
  • Transposicoes especificas: trocar 09 por 90 e algumas outras passam batido.
  • Existencia: um PAN valido no Luhn pode estar nao 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 numeros validos no Luhn trivialmente — nunca use o checksum como unico sinal de fraude.

Para verificacao real de cartao, combine o BIN (primeiros 6 digitos) + ultimos 4 + AVS + 3D Secure + tokenizacao no adquirente. A etapa Luhn e somente uma protecao client-side contra digitacao errada.

FAQ

O algoritmo Luhn pega todo erro de digitacao? Nao. Pega toda substituicao de digito unico 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? Nao. CPF, CNPJ e PIS usam modulo 11 com dois digitos 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 cartao 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 digitos), nao pelo checksum.

Posso gerar um numero valido no Luhn? Sim — por definicao, todo prefixo de 14 digitos admite exatamente um ultimo digito que fecha o checksum. Por isso o Luhn sozinho nunca e defesa contra fraude.

A patente Luhn ainda esta vigente? Nao. A US 2.950.048 foi depositada em 1954, concedida em 1960 e expirou em 1977. O algoritmo esta em dominio publico ha quase meio seculo.

Ferramentas Relacionadas