← Voltar ao blog

Como funciona o algoritmo de Luhn: validação de cartão de crédito explicada

·6 min de leitura

Todo número de cartão de crédito — Visa, Mastercard, Elo, American Express — é validado por um algoritmo inventado em 1954 por Hans Peter Luhn, cientista da IBM. O algoritmo de Luhn (também chamado de mod-10) é um checksum simples que detecta erros de digitação. É usado por gateways de pagamento, formulários de checkout e geradores de cartão de teste.

O algoritmo passo a passo

Dado um número de cartão (ex: 4532015112830366):

  1. Comece pelo último dígito e vá da direita para a esquerda
  2. Dobre cada segundo dígito (posições ímpares contando da direita)
  3. Se o resultado da dobra for maior que 9, subtraia 9
  4. Some todos os dígitos
  5. Se o total for divisível por 10, o número é válido

Exemplo visual

Número: 4 5 3 2 0 1 5 1 1 2 8 3 0 3 6 6
Dobrar: 8 5 6 2 0 1 1 1 2 2 7 3 0 3 3 6
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
Soma: 8+5+6+2+0+1+1+1+2+2+7+3+0+3+3+6 = 50
50 % 10 = 0Válido!

Implementação em JavaScript

function luhnCheck(num: string): boolean {
const digits = num.replace(/\\D/g, '');
let sum = 0;
let alternate = false;
for (let i = digits.length - 1; i >= 0; i--) {
let n = parseInt(digits[i]);
if (alternate) {
n *= 2;
if (n > 9) n -= 9;
}
sum += n;
alternate = !alternate;
}
return sum % 10 === 0;
}

Identificando a bandeira pelo prefixo

Além do checksum, o primeiro dígito (ou primeiros dígitos) identifica a bandeira:

  • Visa: começa com 4 (16 dígitos)
  • Mastercard: começa com 5 (51-55) ou 2 (2221-2720)
  • Elo: prefixos específicos como 636368, 438935, 504175
  • American Express: começa com 34 ou 37 (15 dígitos)

Um gerador de cartão de teste cria números com o prefixo correto da bandeira e calcula o último dígito para que passe no Luhn.

Gere cartões de teste

Use o gerador abaixo para criar números válidos (Luhn + prefixo correto):

Visa, Mastercard e Elo com Luhn válido

Clique em Gerar para começar

Luhn não é segurança

É importante entender que o Luhn é apenas um checksum para detectar erros de digitação — não é criptografia e não garante que o cartão existe ou tem saldo. Gateways de pagamento fazem validações adicionais (BIN lookup, verificação com o emissor, 3D Secure) antes de autorizar uma transação.

Por isso, cartões gerados passam na validação de formulário mas são recusados por qualquer gateway real. São úteis exclusivamente para testar a camada de validação do seu frontend.

Resumo

  • O algoritmo de Luhn valida números de cartão com um checksum mod-10
  • É simples de implementar (~15 linhas de código) e não requer libs externas
  • O prefixo identifica a bandeira (4=Visa, 5=Mastercard, etc.)
  • Cartões gerados passam no Luhn mas não funcionam para compras reais
  • Use o gerador de cartão para testes de formulário
  • Use a API para gerar em massa no CI/CD