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
- A partir do digito mais a direita, dobre cada segundo digito.
- Se o valor dobrado passar de 9, subtraia 9 (equivale a somar seus dois digitos).
- Some todos os digitos transformados, incluindo o ultimo a direita que nunca e dobrado.
- 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
Xpara 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
09por90e 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
Validador de Conta Bancária
Valide números de conta bancária pelo dígito verificador para os principais bancos brasileiros (Bradesco, Itaú, Banco do Brasil, Santander e Caixa). Verificação no navegador.
Validador de Número de Cartão de Crédito
Valide números de cartão de crédito pelo algoritmo Luhn. Identifica a bandeira e verifica o dígito verificador, sem enviar dados para servidores.
Validador de Número de Recibo
Valida formato comum de número de recibo (REC-AAAA-NNNNN ou REC.NNNNN). Aceita variações com pontos e traços. Verifica ano válido.