Validando Cartões de Crédito — Luhn Algorithm.

Estou fazendo automações de testes com uma feature de cartão de crédito, e como todo QA me questionei, como posso validar se um cartão de crédito está valido ou não, estou inserindo “000” e ele deixa passar como o Dev fez essa implementação e fui investigar.

Reinaldo Mateus Rossetti Junior
4 min readDec 8, 2021

No geral para validar um cartão de crédito utilizamos o Algoritmo de Luhnn, mas não somente ele, outros pontos também devem ser avaliados.

Validações que o QA pode fazer:

  1. Possuir somente números, sem espaços em branco e caracteres especiais no código. Isso pode quebrar o sistema caso aconteça. Geralmente essa validação deve estar no backend da aplicação, quando é feita no front, as ferramentas de segurança explora essa vulnerabilidade burlando o front end. Por maior segurança pode ser feito nas duas pontas.
  2. Ter entre 12 e 19 dígitos. Vai fazer testes com valor inferior e superior deve apresentar mensagem de erro.
  3. Os 6 primeiros dígitos devem indicar um IIN (Issuer identification number) válido. Ele é chamado de BIN no meio bancário.
  4. Passar na validação do Algoritmo de Luhn. A aplicação deve implementar a validação do cartão de crédito usando o Algoritmo de Luhn.
  5. Validar o soma igual a Zero, o zero ele passa no algoritmo de Luhnn, ou seja “0000” ou “00000000000000000” ele considera como válido, no entanto não é um valor válido de cartão.

Validador online:

https://www.vccgenerator.org/br/credit-card-validator-result/

Gerador de Cartão de Crédito: https://www.4devs.com.br/gerador_de_numero_cartao_credito

Consulta BIN (Exemplo cielo):

O BIN de um cartão é composto pelos seis primeiros dígitos. Na simulação do Consulta BIN em ambiente sandbox, cada dígito vai reger um resultado simulado. É possível montar uma numeração de cartão para teste e observar o retorno esperado de acordo com diferentes cenários.

Os seis primeiros dígitos do cartão irão retornar a bandeira, o tipo, a nacionalidade, se o cartão é corporativo ou não, o retorno da análise de BIN e o emissor do cartão. Para saber mais, leia a seção Consulta BIN no link abaixo.

Exemplo:

O cartão com a numeração 4110110012341234 irá retornar os seguintes dados:

  • Bandeira: Visa;
  • Tipo do cartão: múltiplo;
  • Nacionalidade: nacional;
  • Cartão corporativo: não;
  • Retorno da análise: 00 — Análise autorizada;
  • Banco emissor: “104” e “Caixa”.

Manual de Integração eCommerce Cielo · Documentações e tutoriais

Lógica do Algoritmo:

Total Número Original : 4 5 5 6 7 3 7 5 8 6 8 9 9 8 5 5
Tirando o último dígito : 4 5 5 6 7 3 7 5 8 6 8 9 9 8 5
Invertendo : 5 8 9 9 8 6 8 5 7 3 7 6 5 5 4
Multiplicando casas ímpares por 2 : 10 8 18 9 16 6 16 5 14 3 14 6 10 5 8
Subtraia 9 de todos os números acima de 9: 1 8 9 9 7 6 7 5 5 3 5 6 1 5 8
Somando todos os números : 1 8 9 9 7 6 7 5 5 3 5 6 1 5 8

85 modulo 10 = 5 (last digit of card)

Algoritmo em Kotlin usando o substitution digits, que é uma validação mais precisa que acima (https://en.wikipedia.org/wiki/Luhn_algorithm):

fun valid(number: String): Boolean {
var checksum: Int = 0
for (i in number.length - 1 downTo 0 step 2) {
checksum += number.get(i) - '0'
}
for (i in number.length - 2 downTo 0 step 2) {
val n: Int = (number.get(i) - '0') * 2
checksum += if (n > 9) n - 9 else n
}
return checksum%10 == 0
}
fun main(){
val result = valid("4556737586899855")
println("Valid: $result") // Valid: true
val result = valid("11111111111111111")
println("Valid: $result") // Valid: false
}

Outra forma de implementação e tem uma explicação detalhada é no site do geeksforgeeks, super recomendado a leitura.

https://www.geeksforgeeks.org/luhn-algorithm/

Sobre mais:

https://www.freeformatter.com/credit-card-number-generator-validator.html#howToValidate

Projeto de Exemplo em Kotlin e outras linguagens, créditos para Leigh McCulloch:

Uma boa referência de documentação:

--

--