Pegue uma CNH e conte os números impressos nela. São pelo menos três, em campos distintos, e apenas um é o que os sistemas costumam chamar de “número da CNH”. Confundir um com o outro é a origem de boa parte dos cadastros de condutor que não batem entre o RH, a transportadora e o aplicativo de entrega — e também da pergunta que aparece toda semana em fórum de desenvolvedor: por que dois validadores de CNH devolvem dígitos diferentes para o mesmo número.
Três números, três funções: registro, espelho e RENACH
O número de registroé o identificador nacional do condutor. Tem onze algarismos, sendo nove de base e dois dígitos verificadores, e é o único dos três que segue uma fórmula pública de conferência. É esse número que deve ser gravado quando um sistema fala em “número da CNH”.
O número do espelho identifica a via física — o cartão em si. Cada emissão gera um espelho novo, então esse número é um dado do documento, não da pessoa. Ele serve para dizer qual via está em circulação e para casar o plástico com o registro do processo de emissão.
O RENACH é o cadastro nacional de condutores habilitados; o campo que aparece com esse nome em formulários e telas de DETRAN é, na prática, o número do processo aberto no órgão estadual, normalmente exibido como a sigla da UF seguida de uma sequência numérica. Ele acompanha o trâmite (exames, aulas, prova, emissão) e é o identificador que o despachante e o atendente usam para consultar o andamento. Não tem dígito verificador publicado, não é nacionalmente único no mesmo sentido do registro e não deve ser usado como chave de condutor.
Há ainda um código de segurançaimpresso no documento, que serve à conferência da via e não identifica o condutor. Se o seu cadastro tem um único campo chamado “CNH”, ele precisa guardar o registro — os outros são dados auxiliares, quando muito.
O que muda quando o condutor renova ou tira segunda via
O registro é atribuído na primeira habilitação e acompanha a pessoa. Na renovação, na mudança de categoria, na troca de estado ou na segunda via por perda, o registro continua o mesmo; o que muda é o espelho, a data de validade e, eventualmente, o processo RENACH aberto para aquela emissão.
Essa distinção tem consequência prática em modelagem. Se o seu sistema trata a CNH como campo mutável do cadastro e reescreve o valor a cada atualização de documento, você provavelmente está gravando o número do espelho em algum momento e o registro em outro — e aí dois cadastros do mesmo motorista deixam de se reconhecer. O registro é estável o bastante para servir de chave natural de condutor dentro do seu domínio; o espelho, não.
A CNH digital não cria um número novo. Ela é a mesma habilitação exibida no aplicativo oficial de carteira digital de trânsito, com um QR Code que resolve contra a base do órgão de trânsito. O registro exibido ali é idêntico ao do plástico.
Como o dígito verificador é calculado
Os nove primeiros algarismos formam a base. Os dois últimos saem de dois cálculos de módulo 11 feitos sobre a mesma base, com escadas de pesos espelhadas: o primeiro usa os pesos 9 a 1, da esquerda para a direita; o segundo usa 1 a 9, na mesma direção.
Duas particularidades separam a CNH do CPF. A primeira: o segundo cálculo não inclui o primeiro dígito verificador, ao contrário do que acontece no CPF e no CNPJ. Os dois DVs são calculados em paralelo, a partir do mesmo insumo. A segunda: o dígito é o próprio resto da divisão por 11, e não 11 − resto.
Como os pesos aplicados a cada posição somam 10 nas duas escadas (9 e 1 na primeira posição, 8 e 2 na segunda, e assim por diante), as duas somas guardam uma relação fixa: juntas, dão dez vezes a soma dos algarismos da base. É um bom teste de sanidade quando se está depurando a implementação.
Vamos calcular os dois dígitos da base 064725819. O zero inicial é proposital: registros com zero à esquerda são comuns e já derrubaram muita importação que tratou o campo como número inteiro.
| Caractere | Peso | Produto |
|---|---|---|
| 0 | 9 | 0 |
| 6 | 8 | 48 |
| 4 | 7 | 28 |
| 7 | 6 | 42 |
| 2 | 5 | 10 |
| 5 | 4 | 20 |
| 8 | 3 | 24 |
| 1 | 2 | 2 |
| 9 | 1 | 9 |
| Soma | 183 | |
183 ÷ 11 → resto 7
O dígito é o próprio resto, desde que ele seja menor que 10.
Dígito verificador = 7
| Caractere | Peso | Produto |
|---|---|---|
| 0 | 1 | 0 |
| 6 | 2 | 12 |
| 4 | 3 | 12 |
| 7 | 4 | 28 |
| 2 | 5 | 10 |
| 5 | 6 | 30 |
| 8 | 7 | 56 |
| 1 | 8 | 8 |
| 9 | 9 | 81 |
| Soma | 237 | |
237 ÷ 11 → resto 6
Resto menor que 10 e sem desconto a aplicar: o dígito é o resto.
Dígito verificador = 6
O registro completo é 06472581976. Conferindo a relação entre as somas: os algarismos da base somam 42, e 183 + 237 = 420, dez vezes 42.
const BASE_LENGTH = 9;
function calculateCheckDigits(base9: string): string | null {
let sum1 = 0;
for (let i = 0; i < BASE_LENGTH; i++) {
sum1 += Number(base9[i]) * (9 - i);
}
const rest1 = sum1 % 11;
const dv1 = rest1 >= 10 ? 0 : rest1;
const discount = rest1 >= 10 ? 2 : 0;
let sum2 = 0;
for (let i = 0; i < BASE_LENGTH; i++) {
sum2 += Number(base9[i]) * (i + 1);
}
const rest2 = sum2 % 11;
const dv2 = rest2 >= 10 ? 0 : rest2 - discount;
// Sem DV possível: a base cai na zona contestada e o segundo
// dígito ficaria negativo depois do desconto.
if (dv2 < 0) return null;
return String(dv1) + String(dv2);
}O caso do resto 10 e por que validadores discordam
O resto da divisão por 11 vai de 0 a 10, mas um dígito verificador só comporta 0 a 9. Quando o primeiro cálculo dá resto 10, a regra clássica dos DETRANs faz duas coisas: registra 0 como primeiro dígito e aplica um desconto de 2 no segundo. É essa correção que as bibliotecas implementam de maneiras diferentes.
A discordância não é difusa: enquanto o primeiro resto for diferente de 10, todas as implementações que testamos devolvem exatamente o mesmo par de dígitos. O desacordo mora inteiro dentro da zona do resto 10, que cobre cerca de um em cada onze números-base, e mesmo lá só aparece em três dos onze valores possíveis do segundo resto.
| Resto do 2º cálculo | Regra do desconto | Implementações que fazem o desconto circular |
|---|---|---|
| 0 | sem dígito possível (0 − 2 seria negativo) | 09 |
| 1 | sem dígito possível (1 − 2 seria negativo) | 00 |
| 2 a 9 | resto − 2 (ex.: resto 4 → DV 02) | igual |
| 10 | 00 (o 10 vira 0 antes do desconto) | 08 |
O exemplo mais claro é a base 646897755. Os dois cálculos dão soma 285 e resto 10 cada um. Pela regra do desconto direto, o número fica 64689775500; por uma implementação que trata o desconto como operação circular sobre o módulo 11, fica 64689775508. Os dois validadores estão convictos e nenhum dos dois aceita o número do outro.
Do outro lado estão as bases como 379393858, em que o primeiro resto é 10 e o segundo é 1: o desconto levaria o segundo dígito a −1, e a implementação estrita conclui que aquela base simplesmente não tem registro válido, enquanto a circular devolve 00.
A consequência para quem gera dados de teste é direta: nunca gere um número cuja base caia nessa zona. O gerador de CNH descarta bases com resto 10 no primeiro cálculo e sorteia outra, de modo que todo número produzido passa nas duas famílias de validadores. Custa cerca de 9% de descarte no sorteio e elimina a classe inteira de falso negativo em ambiente de homologação.
Se você mantém um validador próprio, a recomendação é a mesma vista do outro lado: seja permissivo nessa faixa. Aceitar os dois resultados quando o primeiro resto é 10 é preferível a recusar o documento de um condutor real por divergência de arredondamento.
O que o número não diz: categoria, validade e pontuação
Diferente do CPF, que carrega a região fiscal no nono algarismo, o registro da CNH não codifica nada legível. Não dá para extrair dele o estado emissor, o ano da primeira habilitação nem a categoria.
A categoria (A para motocicletas, B para automóveis, C, D e E para carga e transporte de passageiros, além das combinações como AB) é um atributo separado do cadastro, que muda ao longo da vida do condutor sem tocar no registro. A validade depende da faixa etária e da aptidão no exame médico, e também vive fora do número. A pontuação por infrações fica no prontuário do condutor, atualizada por eventos que nada têm a ver com o documento impresso.
Em outras palavras, um número de CNH com dígitos verificadores corretos não afirma que existe um condutor, que ele está habilitado, que a habilitação está no prazo ou que ele pode dirigir aquele caminhão. O DV é uma barreira contra erro de digitação, não uma prova de nada — a mesma distinção que vale para o CPF válido que não existe.
Como verificar uma CNH de verdade
A checagem real passa pelos canais oficiais. No Portal de Serviços do SENATRAN, o próprio condutor, autenticado com a conta gov.br, consulta a situação da habilitação, a pontuação e os veículos vinculados. O aplicativo oficial de carteira digital exibe o documento com QR Code, que um fiscal ou um balcão pode conferir contra a base. DETRANs estaduais oferecem consultas complementares para quem tem processo aberto naquela UF.
O que não existe é uma consulta pública aberta que, a partir do número, confirme para terceiros se a CNH existe e está válida. Empresas que precisam verificar habilitação de motoristas em escala fazem isso por convênio com o órgão de trânsito ou por intermediários autorizados, com base legal para tratar o dado. Se a sua regra de negócio depende de confirmar habilitação, planeje essa integração desde o começo: validar o DV localmente é o primeiro filtro, nunca a resposta.
Modelando o campo em sistemas de frota, mobilidade e RH
O registro é uma sequência de onze algarismos com zeros significativos à esquerda. Guarde como texto de tamanho fixo, com CHAR(11) ou VARCHAR(11), nunca como inteiro. A normalização de entrada deve remover pontos, hifens e espaços antes de validar, porque o número é digitado de todo jeito.
CREATE TABLE condutor (
id bigserial PRIMARY KEY,
nome text NOT NULL,
cnh_registro char(11) NOT NULL UNIQUE
CHECK (cnh_registro ~ '^[0-9]{11}$'),
cnh_categoria text NOT NULL,
cnh_validade date NOT NULL,
renach text,
criado_em timestamptz NOT NULL DEFAULT now()
);Três decisões que costumam ser esquecidas nessa tabela. A categoria é campo próprio porque muda sem que o registro mude. A validade é date e pertence à via atual, então precisa ser atualizada a cada renovação. E o RENACH, se for guardado, fica em coluna separada e sem restrição de unicidade — ele identifica processo, não pessoa.
Em cadastros de frota, a chave de negócio que interessa quase sempre é o par condutor + veículo, e o veículo tem os seus próprios identificadores, como o RENAVAM e a placa. Misturar os dois domínios em uma tabela só é o começo de uma migração dolorosa.
Para popular ambientes de desenvolvimento, homologação e demonstração, use números fictícios com DV correto. Registros reais de motoristas em base de teste são dado pessoal circulando fora da finalidade para a qual foram coletados — o assunto do guia sobre LGPD e dados de teste.
Erros comuns em cadastros de condutores
- Gravar o espelho no lugar do registro.Acontece quando a tela de cadastro pede “número do documento” e o atendente lê o campo errado do plástico. O sintoma é o mesmo motorista duplicado depois de uma renovação.
- Perder o zero à esquerda. Planilha, coluna numérica, importação por CSV: o registro
06472581976vira6472581976e nunca mais valida. Converta a coluna para texto antes de exportar. - Aceitar sequências repetidas.
11111111111passa nos dois cálculos de módulo 11 e não é um registro plausível. Barre explicitamente os onze algarismos iguais, como se faz no CPF. - Validar o DV e concluir que o condutor está habilitado. Esses são problemas distintos, e o segundo não tem solução local.
- Trocar de biblioteca de validação sem testar a zona do resto 10. A migração parece inofensiva porque 97,5% dos números continuam válidos. Os registros que quebram são poucos, aparecem meses depois e sempre em produção.
- Usar CNHs reais para demonstração. Uma tela de demo com documento verdadeiro na frente de um cliente é vazamento com plateia.