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
- A partir do dígito mais a direita, dobre cada segundo dígito.
- Se o valor dobrado passar de 9, subtraia 9 (equivale a somar seus dois dígitos).
- Some todos os dígitos transformados, incluindo o último a direita que nunca e dobrado.
- 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
Xpara 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
09por90e 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
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 Last-Modified
Valide se um cabeçalho HTTP Last-Modified está no formato correto (HTTP-date, RFC 7231). Útil para depurar cache de navegador, CDNs e desempenho de sites.
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.
Validador de PIS/PASEP
Valide números de PIS/PASEP pelo algoritmo oficial com dígito verificador, sem enviar dados para servidores. Gratuito e sem cadastro.
Validador de ICCID (Chip SIM)
Valide o ICCID (Integrated Circuit Card Identifier) de chips SIM (19-20 dígitos) com checagem do dígito Luhn e identificação da operadora.