🌐 Idioma: 🇧🇷 Português

CNH — Validar e Gerar 2026

Valide números de CNH ou gere válidos para testes. Verificação completa dos dois dígitos verificadores.

Configuração
🚗

Informe uma CNH ou gere novas

Como funciona a CNH

A CNH tem 11 dígitos. Os dois últimos são dígitos verificadores calculados pelo módulo 11 com pesos variáveis.

O primeiro verificador usa pesos 1 a 9 (ascendente) sobre os 9 primeiros dígitos. O segundo verificador usa pesos 9 a 1 (descendente), com ajuste (DSC) quando o primeiro verificador é zero.

⚠️ CNHs geradas são fictícias, válidas matematicamente mas não vinculadas a nenhuma pessoa real. Use apenas para testes.

🪪 O que é a CNH e como é estruturada?

A CNH (Carteira Nacional de Habilitação) é o documento oficial que habilita o cidadão brasileiro a conduzir veículos automotores no território nacional. Emitida pelo DETRAN de cada estado e regulamentada pelo DENATRAN (hoje SENATRAN), é controlada pelo RENACH (Registro Nacional de Carteiras de Habilitação), sistema federal que unifica os dados de todos os condutores do país.

Para fins de sistemas e validação, o que importa é o Registro de CNH: um número de 11 dígitos onde os 9 primeiros formam o número base e os 2 últimos são dígitos verificadores calculados por um algoritmo módulo 11 com pesos variáveis — similar ao CPF, mas com lógica diferente.

PosiçãoDescriçãoExemplo
1–9Número base da CNH123456789
101° dígito verificador (DV1)0
112° dígito verificador (DV2)9
1–11Registro completo da CNH12345678909

🕰️ Breve História da CNH no Brasil

1941
Decreto-Lei 2.994 — primeiro código de trânsito
O Brasil cria seu primeiro Código Nacional de Trânsito, regulamentando a habilitação de condutores. A carteira de habilitação era um documento físico estadual, sem padronização nacional — cada DETRAN emitia em formato próprio.
1966
Lei 5.108 — Código Nacional de Trânsito unificado
Primeiro esforço real de padronização nacional. Define as categorias de habilitação (A, B, C, D, E) e começa o processo de unificação dos registros entre estados. A carteira ainda era impressa em papel com dados preenchidos à mão ou datilografados.
1997
CTB — Código de Trânsito Brasileiro moderno
A Lei 9.503/1997 cria o atual Código de Trânsito Brasileiro, ainda em vigor. Estabelece o sistema de pontuação, as categorias atuais de CNH e cria o DENATRAN como órgão federal coordenador. A CNH ganha formato plástico padronizado nacionalmente pela primeira vez.
2000s
RENACH — Registro Nacional informatizado
O RENACH (Registro Nacional de Carteiras de Habilitação) é implantado como banco de dados federal integrado aos DETRANs estaduais. O número de registro da CNH se torna o identificador único do condutor no sistema, com os 11 dígitos e os dois verificadores matemáticos.
2016
CNH Digital — documento eletrônico oficial
O DENATRAN lança a CNH Digital, versão eletrônica com QR Code e certificado digital, aceita como documento oficial no Brasil. O número de registro de 11 dígitos permanece o mesmo — a mudança é apenas no suporte físico/digital do documento.
2021
SENATRAN substitui DENATRAN
O DENATRAN é extinto e substituído pela Secretaria Nacional de Trânsito (SENATRAN), subordinada ao Ministério da Infraestrutura. As regras da CNH e do número de registro permanecem inalteradas — apenas a estrutura administrativa muda.

⚙️ Algoritmo de Validação da CNH — Passo a Passo

O algoritmo usa módulo 11 com dois cálculos distintos de pesos — um ascendente (1→9) para o primeiro verificador e um descendente (9→1) para o segundo, com um DSC (desconto) especial quando o primeiro dígito verificador é zero.

Exemplo completo: CNH 12345678909
1
9 dígitos base
1 2 3 4 5 6 7 8 9
2
Pesos DV1 (1→9)
×1 ×2 ×3 ×4 ×5 ×6 ×7 ×8 ×9
3
Produtos DV1
1 + 4 + 9 + 16 + 25 + 36 + 49 + 64 + 81 = 285
4
DV1 = 285 % 11
285 mod 11 = 10 → DV1 = 0   (≥10 → DV1 = 0, DSC = 2)
5
Pesos DV2 (9→1)
×9 ×8 ×7 ×6 ×5 ×4 ×3 ×2 ×1
6
Soma DV2 + DSC
9+16+21+24+25+24+21+16+9 = 165 + DSC(2) = 167
7
DV2 = 167 % 11
167 mod 11 = 2 → DV2 = 9   (11 - 2 = 9)
8
CNH válida
12345678909 ✓
⚠️

Regra especial do DSC: Quando o resultado da soma para DV1 mod 11 for ≥ 10, o DV1 é definido como 0 e o DSC (desconto) é ajustado para 2. Esse DSC é somado à soma do DV2 antes de calcular o módulo. Se o resultado do DV2 mod 11 também for ≥ 10, o DV2 é definido como 0.

💻 Validação de CNH em Diferentes Linguagens

JavaScript
function validarCNH(cnh) {
  // Remove não-dígitos e valida comprimento
  cnh = cnh.replace(/\D/g, '');
  if (cnh.length !== 11) return false;
  // Rejeita sequências repetidas (ex.: 00000000000)
  if (/^(\d)\1+$/.test(cnh)) return false;

  const digits = cnh.split('').map(Number);
  let soma = 0, dsc = 0;

  // Calcula DV1 com pesos 1 a 9
  for (let i = 0; i < 9; i++) soma += digits[i] * (i + 1);
  let dv1 = soma % 11;
  if (dv1 >= 10) { dv1 = 0; dsc = 2; }

  // Calcula DV2 com pesos 9 a 1
  soma = 0;
  for (let i = 0; i < 9; i++) soma += digits[i] * (9 - i);
  soma += dsc;
  let dv2 = soma % 11;
  if (dv2 >= 10) dv2 = 0;

  return digits[9] === dv1 && digits[10] === dv2;
}

console.log(validarCNH('12345678909')); // true
console.log(validarCNH('12345678900')); // false
Python
import re

def validar_cnh(cnh: str) -> bool:
    cnh = re.sub(r'\D', '', cnh)
    if len(cnh) != 11: return False
    if len(set(cnh)) == 1: return False  # todos iguais

    digits = [int(d) for d in cnh]
    dsc = 0

    # DV1 — pesos 1 a 9
    soma = sum(digits[i] * (i + 1) for i in range(9))
    dv1 = soma % 11
    if dv1 >= 10:
        dv1, dsc = 0, 2

    # DV2 — pesos 9 a 1
    soma = sum(digits[i] * (9 - i) for i in range(9)) + dsc
    dv2 = soma % 11
    if dv2 >= 10:
        dv2 = 0

    return digits[9] == dv1 and digits[10] == dv2


print(validar_cnh('12345678909'))  # True
print(validar_cnh('00000000000'))  # False
PHP
function validarCNH(string $cnh): bool {
    $cnh = preg_replace('/\D/', '', $cnh);
    if (strlen($cnh) !== 11) return false;
    if (preg_match('/^(\d)\1+$/', $cnh)) return false;

    $digits = array_map('intval', str_split($cnh));
    $dsc = 0; $soma = 0;

    for ($i = 0; $i < 9; $i++) $soma += $digits[$i] * ($i + 1);
    $dv1 = $soma % 11;
    if ($dv1 >= 10) { $dv1 = 0; $dsc = 2; }

    $soma = 0;
    for ($i = 0; $i < 9; $i++) $soma += $digits[$i] * (9 - $i);
    $dv2 = ($soma + $dsc) % 11;
    if ($dv2 >= 10) $dv2 = 0;

    return $digits[9] === $dv1 && $digits[10] === $dv2;
}
Java
public static boolean validarCNH(String cnh) {
    cnh = cnh.replaceAll("\\D", "");
    if (cnh.length() != 11) return false;
    if (cnh.matches("(\\d)\\1{10}")) return false;

    int[] d = cnh.chars().map(c -> c - '0').toArray();
    int soma = 0, dsc = 0;

    for (int i = 0; i < 9; i++) soma += d[i] * (i + 1);
    int dv1 = soma % 11;
    if (dv1 >= 10) { dv1 = 0; dsc = 2; }

    soma = 0;
    for (int i = 0; i < 9; i++) soma += d[i] * (9 - i);
    int dv2 = (soma + dsc) % 11;
    if (dv2 >= 10) dv2 = 0;

    return d[9] == dv1 && d[10] == dv2;
}
C# / .NET
public static bool ValidarCNH(string cnh) {
    cnh = Regex.Replace(cnh, @"\D", "");
    if (cnh.Length != 11) return false;
    if (Regex.IsMatch(cnh, @"^(\d)\1+$")) return false;

    int[] d = cnh.Select(c => c - '0').ToArray();
    int soma = 0, dsc = 0;

    for (int i = 0; i < 9; i++) soma += d[i] * (i + 1);
    int dv1 = soma % 11;
    if (dv1 >= 10) { dv1 = 0; dsc = 2; }

    soma = 0;
    for (int i = 0; i < 9; i++) soma += d[i] * (9 - i);
    int dv2 = (soma + dsc) % 11;
    if (dv2 >= 10) dv2 = 0;

    return d[9] == dv1 && d[10] == dv2;
}

🔀 CNH vs CPF: Diferenças do Algoritmo Módulo 11

Característica CNH CPF
Total de dígitos 11 11
Dígitos verificadores 2 (posições 10 e 11) 2 (posições 10 e 11)
Pesos DV1 1, 2, 3, 4, 5, 6, 7, 8, 9 (crescente) 10, 9, 8, 7, 6, 5, 4, 3, 2 (decrescente)
Pesos DV2 9, 8, 7, 6, 5, 4, 3, 2, 1 (decrescente) 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 (inclui DV1)
Regra ≥ 10 DV = 0 e aplica DSC = 2 no DV2 DV = 0 (simples)
DSC especial Sim — quando DV1 ≥ 10 Não
Dígito regional Não (no registro) Sim — posição 9 indica região

🛠️ Casos de Uso em Desenvolvimento e Testes

🧪

Testes de formulários: Sistemas de frota, locadoras, seguros e detrans precisam validar CNH em tempo real no frontend. Use o gerador para criar massas de dados de teste sem expor dados reais de condutores.

🔒

LGPD e dados pessoais: CNH é dado pessoal sensível conforme a LGPD. Em ambientes de desenvolvimento e homologação, nunca use CNHs reais — use sempre dados gerados fictícios que passem na validação matemática mas não correspondam a pessoas reais.

Validação frontend vs backend: Valide a CNH no frontend para UX (feedback imediato), mas sempre revalide no backend antes de persistir. Nunca confie apenas na validação client-side — ela pode ser bypassada facilmente.

⚠️

CNH válida matematicamente ≠ CNH existente: Um número que passa na validação dos dígitos verificadores pode não corresponder a nenhum condutor real no RENACH. A validação matemática confirma apenas que os dígitos foram calculados corretamente — não que a CNH está ativa ou cadastrada.

Perguntas Frequentes

Sim, para fins de desenvolvimento e testes. Gerar números que passam na validação matemática é legal para testar sistemas, preencher bancos de dados de homologação e desenvolver validadores. O que é ilegal é usar números reais de terceiros sem autorização, apresentar CNH falsa como documento oficial, ou usar dados gerados para fraude. Ferramentas de geração de documentos fictícios para desenvolvimento são amplamente utilizadas e aceitas na indústria de software.

Por convenção do algoritmo — e para evitar valores triviais — números como 00000000000, 11111111111 e outros com todos os dígitos iguais são considerados inválidos, mesmo que matematicamente possam passar nos cálculos de módulo. É o mesmo tratamento dado ao CPF. Na prática, é um filtro de sanidade básico que qualquer validador deve implementar.

Não. O número de registro da CNH é permanente e vinculado ao condutor no RENACH — não muda com renovações, mudanças de categoria, adição de ACC (autorização para conduzir ciclomotores) ou mudança de estado. O que muda a cada renovação é o número do documento físico (impresso no canto da carteira), não o número de registro de 11 dígitos usado para validação.

Antes de calcular os dígitos verificadores, aplique estas validações rápidas:

  • Somente dígitos: /^\d{11}$/
  • Não todos iguais: /^(?!(\d)\1+$)/
  • Comprimento exato: 11 caracteres após remover espaços e hífens

Essas verificações eliminam entradas obviamente inválidas antes do cálculo custoso — boa prática para validação em massa.

Sim, mas requer credenciais e autorização do SENATRAN/DETRAN. Opções disponíveis:

  • Portal de Serviços SENATRAN: consulta manual em detran.gov.br
  • APIs de bureaux de dados (Serpro, Neoway, SPC, Boa Vista): oferecem consulta programática com contrato, usada por locadoras, seguradoras e frotas
  • Gov.br: o sistema de login único do governo permite acesso à CNH digital do usuário com consentimento explícito

Nenhuma dessas opções é gratuita para consulta em massa — apenas a validação matemática (o que este validador faz) é livre.

📌 Resumo do Algoritmo para Referência Rápida

1️⃣

Extraia os 9 dígitos base (posições 1–9). Rejeite se comprimento ≠ 11 ou todos os dígitos forem iguais.

2️⃣

DV1: some cada dígito × peso crescente (1, 2, ..., 9). DV1 = soma % 11. Se ≥ 10 → DV1 = 0 e DSC = 2.

3️⃣

DV2: some cada dígito × peso decrescente (9, 8, ..., 1) + DSC. DV2 = soma % 11. Se ≥ 10 → DV2 = 0.

4️⃣

Validação: dígito[9] == DV1 E dígito[10] == DV2. Ambos devem bater — se qualquer um falhar, a CNH é inválida.

Complexidade: O(n) com n=11 — validação instantânea, sem necessidade de lookup externo. Ideal para validação em formulários com feedback em tempo real (onInput/onChange).