curl · bash · Postman

Validar CNH via curl

Para validar CNH via curl, recalcule os dois dígitos verificadores do registro de 11 dígitos pelo mod-11 do DENATRAN, com pesos 9 a 1 e 1 a 9. Quando o primeiro cálculo dá resto 10, o dígito vira 0 e o segundo perde 2. A validação confirma só a matemática, não se a habilitação está vigente. Abaixo: uma função em bash puro, testes e conferência com CNHs da API.

Fonte: algoritmo do dígito verificador do número de registro da CNH, do DENATRAN (hoje Senatran).

TL;DR

valida_cnh() {
  local d=${1//[^0-9]/} k s1=0 s2=0 dv1 dv2 dsc=0
  [[ ${#d} -eq 11 && -n ${d//${d:0:1}/} ]] || return 1
  for ((k = 0; k < 9; k++)); do s1=$((s1 + ${d:k:1} * (9 - k))); s2=$((s2 + ${d:k:1} * (k + 1))); done
  dv1=$((s1 % 11)); if ((dv1 >= 10)); then dv1=0; dsc=2; fi
  dv2=$(( (s2 % 11 - dsc + 11) % 11 )); ((dv2 >= 10)) && dv2=0
  ((dv1 == ${d:9:1} && dv2 == ${d:10:1}))
}

valida_cnh "123 456 789 00" && echo "válida" || echo "inválida"
valida_cnh "123 456 789 01" && echo "válida" || echo "inválida"

bash 4+ (Linux, Git Bash, WSL). O macOS traz bash 3.2: instale um bash atual pelo Homebrew.

Rota 1: validar CNH via curl com o algoritmo local

Versão completa com o desconto do segundo dígito comentado. Aceita espaços, pontos e hífen, e rejeita os 11 dígitos iguais.

#!/usr/bin/env bash
# validador-cnh.sh: bash 4+, sem dependências. Use com source ou direto.
# Saída: 0 = válida, 1 = inválida

valida_cnh() {
  [[ $1 =~ ^[0-9\ .-]+$ ]] || return 1
  local d=${1//[^0-9]/} k s1=0 s2=0 dv1 dv2 dsc=0
  [[ ${#d} -eq 11 ]] || return 1
  [[ -z ${d//${d:0:1}/} ]] && return 1   # 11 dígitos iguais

  for ((k = 0; k < 9; k++)); do
    s1=$((s1 + ${d:k:1} * (9 - k)))   # 1º DV: pesos 9 a 1
    s2=$((s2 + ${d:k:1} * (k + 1)))   # 2º DV: pesos 1 a 9
  done

  dv1=$((s1 % 11))
  if ((dv1 >= 10)); then dv1=0; dsc=2; fi   # resto 10: DV vira 0 e o 2º DV perde 2

  dv2=$(( (s2 % 11 - dsc + 11) % 11 ))
  ((dv2 >= 10)) && dv2=0

  ((dv1 == ${d:9:1} && dv2 == ${d:10:1}))
}

if [[ ${BASH_SOURCE[0]} == "$0" ]]; then
  for cnh in "123 456 789 00" "12345678900" "987.654.321-09" "123 456 789 01" "123 456 702 02"; do
    if valida_cnh "$cnh"; then echo "$cnh -> válida"; else echo "$cnh -> inválida"; fi
  done
fi

Como o cálculo do dígito verificador da CNH funciona

Um exemplo calculado à mão, para você conferir o código contra a conta.

CNH 123 456 789 00

1º DV: 1×9 + 2×8 + 3×7 + 4×6 + 5×5 + 6×4 + 7×3 + 8×2 + 9×1
      = 165
      165 mod 11 = 0  ->  DV1 = 0, desconto 0

2º DV: 1×1 + 2×2 + 3×3 + 4×4 + 5×5 + 6×6 + 7×7 + 8×8 + 9×9
      = 285
      285 mod 11 = 10  ->  resultado >= 10 vira 0

Caso do desconto: CNH 123 456 702 02

1º DV: 1×9 + 2×8 + 3×7 + 4×6 + 5×5 + 6×4 + 7×3 + 0×2 + 2×1
      = 142
      142 mod 11 = 10 (>= 10)  ->  DV1 = 0 e desconto = 2

2º DV: 1×1 + 2×2 + 3×3 + 4×4 + 5×5 + 6×6 + 7×7 + 0×8 + 2×9
      = 158
      158 mod 11 = 4, menos o desconto 2 = 2  ->  DV2 = 2

Rota 2: conferir o validador com CNHs da API do FakeForge

A API do FakeForge gera CNHs válidas, mas não tem endpoint de validação. Use o lote gerado como oráculo de teste: todas precisam passar no seu validador, e com o último dígito trocado precisam falhar.

#!/usr/bin/env bash
# confere-cnh-api.sh: salve o validador da Rota 1 como validador-cnh.sh
source ./validador-cnh.sh

rejeitadas=0 aceitas=0 total=0
while read -r cnh; do
  total=$((total + 1))
  valida_cnh "$cnh" || { echo "válida rejeitada: $cnh"; rejeitadas=$((rejeitadas + 1)); }
  errada="${cnh%?}$(( (${cnh: -1} + 1) % 10 ))"
  valida_cnh "$errada" && { echo "inválida aceita: $errada"; aceitas=$((aceitas + 1)); }
done < <(curl -s "https://fakeforge.com.br/api/generate?type=cnh&quantity=30&formatted=false" \
  | grep -oE '"[0-9]{11}"' | tr -d '"')

echo "$total CNHs da API | válidas rejeitadas: $rejeitadas | inválidas aceitas: $aceitas"
(( total > 0 && rejeitadas == 0 && aceitas == 0 ))

Como testar CNH no Postman

Cole o script na aba Tests do request. O Postman roda a mesma validação sobre a resposta e marca cada caso como passou ou falhou.

// Postman > aba Tests do request:
// GET https://fakeforge.com.br/api/generate?type=cnh&quantity=30

function validaCnh(cnh) {
  const d = cnh.replace(/\D/g, '').split('').map(Number);
  if (d.length !== 11 || new Set(d).size === 1) return false;
  let dv1 = d.slice(0, 9).reduce((acc, n, i) => acc + n * (9 - i), 0) % 11;
  let dsc = 0;
  if (dv1 >= 10) { dv1 = 0; dsc = 2; }
  const dv2 = ((d.slice(0, 9).reduce((acc, n, i) => acc + n * (i + 1), 0) % 11) - dsc + 11) % 11;
  return d[9] === dv1 && d[10] === (dv2 >= 10 ? 0 : dv2);
}

pm.test('status 200', () => pm.response.to.have.status(200));

pm.test('todas as CNHs passam no mod-11 DENATRAN', () => {
  const { data } = pm.response.json();
  pm.expect(data).to.have.lengthOf(30);
  data.forEach((cnh) => pm.expect(validaCnh(cnh), cnh).to.be.true);
});

pm.test('validador rejeita CNH com DV trocado', () => {
  const [cnh] = pm.response.json().data;
  const errada = cnh.slice(0, -1) + ((Number(cnh.slice(-1)) + 1) % 10);
  pm.expect(validaCnh(errada)).to.be.false;
});
// Para validar a SUA API, troque por: const cnh = pm.response.json().motorista.cnh;

Validar CNH: algoritmo local ou serviço externo

CenárioAlgoritmo localAPI FakeForge (geração)
Confere os dígitos verificadoresSimNão, a API só gera
Gera CNHs válidas para testeNãoSim, até 10.000 por chamada
Funciona offlineSimNão
Confirma que a habilitação está vigenteNãoNão
DependênciasNenhumaUma chamada HTTP
CustoR$ 0Grátis até 50 chamadas por dia

Perguntas frequentes sobre validar CNH via curl

Como validar CNH via curl?+

Carregue o arquivo com source validador-cnh.sh e chame valida_cnh "123 456 789 00". Saída 0 é válida e 1 é inválida. A função trata o desconto de 2 do segundo dígito. Precisa de bash 4 ou superior.

Como calcular o dígito verificador da CNH?+

O primeiro DV soma os 9 primeiros dígitos com pesos de 9 a 1 e toma o resto por 11. O segundo soma os mesmos 9 dígitos com pesos de 1 a 9, toma o resto por 11 e subtrai o desconto. Resultados de 10 ou mais viram 0.

O que é o desconto de 2 no cálculo da CNH?+

Quando o resto do primeiro DV é 10 ou mais, o DV vira 0 e o segundo DV é calculado subtraindo 2 do resto. Se o resultado ficar negativo, soma-se 11. Esquecer esse passo faz o validador rejeitar cerca de 1 em cada 11 CNHs legítimas.

CNH válida quer dizer habilitação vigente?+

Não. A validação confere só a matemática do número de registro. Vigência, suspensão e categoria só se consultam nos órgãos de trânsito (Senatran e Detrans).

A API do FakeForge valida CNH?+

Não. A API gera CNHs com dígitos corretos (type=cnh), e a validação roda no seu código. Use o lote gerado como casos positivos e troque o último dígito para casos negativos.

Páginas relacionadas