CNH

O número de registro da Carteira Nacional de Habilitação.

  • Matriz de paridade

Validar

Valida um número de registro da CNH: 9 dígitos mais 2 dígitos verificadores (Resolução CONTRAN nº 886/2021, art. 4º).

  • A função ignora espaços, pontos, hifens e barras, em qualquer quantidade e posição (000000001/19 e 000000001-19 são lidos como 00000000119). Qualquer outro caractere torna o valor inválido. Até a 2.4.0 uma barra tornava o valor inválido.
  • Rejeita um valor com os 11 dígitos iguais.
  • São exigidos exatamente 11 dígitos depois de removidos os caracteres ignorados.
  • Só uma string é lida. Qualquer outro tipo retorna false.
  • Nenhum texto oficial publica os pesos dos dígitos verificadores. A Resolução CONTRAN nº 886/2021, art. 4º, e a Resolução CONTRAN nº 1.020/2025, art. 10, dão só o leiaute (9 caracteres e 2 dígitos verificadores). O algoritmo segue uma referência da comunidade.

Decisão pendente

A referência (JS) mantém um resto 1 no primeiro dígito verificador como 1, como fazem os números de registro reais (o art. 4º § 1º diz 0). Python e Erlang usam um algoritmo diferente (de 2022). Veja a decisão em aberto em docs/findings.md (em inglês).

ParâmetroTipoObrigatório
valuestringsim
retornaboolean

Valida uma CNH. Espaços, pontos, hífens e barras são ignorados; qualquer outro caractere invalida o valor.

  • Um valor cujos 11 dígitos são todos iguais é rejeitado, então '11111111111' é inválido.
  • O primeiro dígito verificador mantém o resto 1 como 1, como nos números reais de registro. O art. 4º, § 1º, da Resolução CONTRAN nº 886/2021, em que o resto 0 ou 1 dá 0, fala em "O dígito verificador" sem dizer de qual número: escrito no singular logo depois do Número do Espelho da CNH (o único número do artigo com um só dígito verificador), ele se lê melhor como a regra desse dígito, mas a redação é genérica e não traz pesos, então não serve de fonte para os 2 dígitos verificadores do número de registro; nenhum texto oficial publica os pesos deles. As Resoluções CONTRAN nº 976/2022, nº 998/2023 e nº 1.006/2024 alteram a Resolução nº 886/2021, nenhuma delas no art. 4º. A Resolução CONTRAN nº 1.020/2025, a norma de habilitação mais nova, repete o layout no art. 10 ("nove caracteres e dois dígitos verificadores") sem regra de dígito verificador e não revoga a 886 (art. 140).
import { isValidCnh } from '@brazilian-utils/brazilian-utils';

isValidCnh('00000000119'); // true
isValidCnh('000000001-19'); // true (hífen antes dos dígitos verificadores)
isValidCnh('ab00000000119'); // false (letras são rejeitadas)

Fonte: Resolução CONTRAN nº 886/2021, art. 4º, Resolução CONTRAN nº 1.020/2025, art. 10; pesos conforme o siga0984.

Código: brazilian-utils/javascript
Teste com JavaScript isValidCnh
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (26) e o resultado em cada biblioteca cnh.isValid

Formatar

Formata um número de CNH como 000000000-00 (9 dígitos, hífen, 2 dígitos verificadores).

  • options.pad primeiro completa o valor com zeros à esquerda até 11 dígitos.
  • options.obfuscate (padrão false) oculta com * os 3 primeiros dígitos e os 2 dígitos verificadores, depois do preenchimento: ***503064-**. Funciona junto com pad e em um valor parcial. Como pad, é lido como verdadeiro ou falso: um não booleano como 1 também oculta os dígitos, e 0 não oculta.
  • Nenhuma autoridade publica uma regra de mascaramento para a CNH. A regra é uma analogia com a que as Leis de Diretrizes Orçamentárias fixam para publicar um CPF ("ocultar os três primeiros dígitos e os dois dígitos verificadores", Lei nº 12.309/2010, art. 87, § 5º, repetida até a LDO 2026, Lei nº 15.321/2025, art. 163), não uma norma publicada.
  • cns.format e passport.format não têm a opção obfuscate.
  • Um número só é lido se for um inteiro seguro não negativo. Número negativo, fracionário, não finito ou inseguro retorna uma string vazia (a 2.4.0 lia os dígitos de qualquer número, descartando sinal e ponto decimal).
  • Um valor sem dígitos (vazio, ou só letras e símbolos) retorna uma string vazia mesmo com options.pad. Até a 2.4.0, pad retornava a máscara inteira de zeros (000000000-00).
  • Os dígitos depois do 11º são descartados.
ParâmetroTipoObrigatório
valuestring | numbersim
optionsFormatCnhOptionsnão
options.padbooleannão
options.obfuscatebooleannão
retornastring

Formata uma CNH.

  • Opções (FormatCnhOptions): pad completa o valor com zeros à esquerda até os 11 dígitos antes de aplicar a máscara (padrão false); obfuscate esconde os 3 primeiros dígitos e os 2 dígitos verificadores. Um valor vazio, ou sem dígitos, devolve '' mesmo com pad.
  • O obfuscate é aplicado depois do pad.
  • Nenhuma autoridade publica uma regra de mascaramento para a CNH, então o obfuscate usa a que as Leis de Diretrizes Orçamentárias definem para a divulgação do CPF ("ocultar os três primeiros dígitos e os dois dígitos verificadores", Lei nº 14.194/2021, art. 149, regra criada pela Lei nº 12.309/2010, art. 87, § 5º), um número com a mesma estrutura.
import { formatCnh } from '@brazilian-utils/brazilian-utils';

formatCnh('02650306461'); // 026503064-61
formatCnh('2650306461', { pad: true }); // 026503064-61
formatCnh('02650306461', { obfuscate: true }); // ***503064-**
Código: brazilian-utils/javascript
Teste com JavaScript formatCnh
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (28) e o resultado em cada biblioteca cnh.format

Interpretar

Remove a formatação da CNH e mantém apenas os dígitos, com no máximo 11 dígitos (os dígitos depois do 11º são descartados).

  • Um número só é lido se for um inteiro seguro não negativo. Número negativo, fracionário, não finito ou inseguro retorna uma string vazia (a 2.4.0 lia os dígitos de qualquer número, descartando sinal e ponto decimal).
  • Um valor sem dígitos retorna uma string vazia.
ParâmetroTipoObrigatório
valuestring | numbersim
retornastring

Remove a formatação da CNH, mantém apenas os dígitos e limita o resultado a 11 dígitos.

import { parseCnh } from '@brazilian-utils/brazilian-utils';

parseCnh('026503064-61'); // '02650306461'
Código: brazilian-utils/javascript
Teste com JavaScript parseCnh
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (9) e o resultado em cada biblioteca cnh.parse

Gerar

Gera um número de CNH aleatório e válido: 11 dígitos, sem máscara, que cnh.isValid aceita.

  • Os 9 dígitos base nunca são todos iguais.
ParâmetroTipoObrigatório
retornastring

Gera uma CNH válida aleatória.

import { generateCnh } from '@brazilian-utils/brazilian-utils';

generateCnh(); // '02650306461'

Fonte: Lei nº 14.194/2021, art. 149, a regra de mascaramento do CPF que o obfuscate toma emprestada, criada pela Lei nº 12.309/2010, art. 87, § 5º e repetida pelas LDOs seguintes (a de 2026, Lei nº 15.321/2025, art. 163, a repete).

Código: brazilian-utils/javascript
Teste com JavaScript generateCnh
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (1) e o resultado em cada biblioteca cnh.generate

Fontes oficiais

Atualizado em

Nesta página