Digital Document Checker
Biblioteca Python modular para parsing, verificação e validação de documentos digitais brasileiros codificados em QRCode (padrão SERPRO / VIO / Carteira Digital de Trânsito).
Tipos de documento já com submódulo próprio:
| Tipo | Módulo | Templates | Emissor | Status |
|---|---|---|---|---|
| CNH | documents/cnh.py |
2, 4, 83 | SENATRAN | verificado |
| DNI | documents/dni.py |
8, 9, 73 | TSE | experimental¹ |
| RG Digital | documents/rg.py |
91, 92 | GovBr | experimental¹ |
A arquitetura permite adicionar outros tipos (CRLV, identidades funcionais, ...) como submódulos independentes — veja Adicionando um novo tipo de documento.
¹ Experimental: parsing implementado a partir da engenharia reversa do app oficial, ainda não validado contra amostras reais desses documentos.
⚠️ Leia o Disclaimer / Aviso Legal antes de usar. Projeto pessoal, sem qualquer garantia. O uso é por sua conta e risco.
Objetivo
O objetivo deste projeto é oferecer uma forma programática e aberta de:
- Extrair (parsing) todos os dados contidos no QRCode de um documento digital brasileiro — nome, CPF, categoria, validade, foto, etc.
- Verificar a autenticidade da assinatura digital contra as chaves públicas oficiais (SENATRAN/SERPRO), quando disponíveis.
- Validar o estado do documento (autêntico, vencido, sandbox, template conhecido) devolvendo um resultado estruturado e fácil de consumir.
O parsing sempre acontece — mesmo que a assinatura não confira ou o documento esteja vencido —, de modo que você sempre recebe os dados disponíveis acompanhados dos indicadores de estado.
Princípios de projeto
- O parsing sempre ocorre, independentemente de validade ou autenticidade. Um documento com assinatura inválida ou vencido ainda tem todos os seus campos extraídos.
- O resultado (
DocumentResult) traz todos os dados disponíveis mais campos de estado padronizados:is_parsed,is_authentic,is_signature_checked,is_expired,is_valid, além deerrorsewarnings. - Modular por tipo: cada documento tem seu submódulo em
digital_document_checker/documents/com umDocumentHandler.
Instalação
pip install -e . # núcleo (parsing + verificação de assinatura)
pip install -e ".[full]" # + leitura de QRCode em imagens e PDFs
Dependências opcionais:
| Recurso | Pacotes |
|---|---|
| Verificação de assinatura | cryptography (núcleo) |
| Ler QRCode de imagem | pyzbar, Pillow |
| Ler QRCode de PDF | PyMuPDF (ou pdf2image) |
| Converter a foto BPG para PNG | binário bpgdec (libbpg) |
pyzbarrequer a biblioteca nativa zbar (brew install zbarno macOS,apt-get install libzbar0no Linux).
Uso rápido
from digital_document_checker import DigitalDocumentChecker
checker = DigitalDocumentChecker()
result = checker.parse_pdf("cnh.pdf") # ou parse_image / parse_bytes / parse_base64
print(result.document_type) # "cnh"
print(result.is_authentic, result.is_expired) # True/False
print(result.fields["nome"], result.fields["cpf"])
if result.photo:
result.photo.save("foto.png", as_png=True) # BPG -> PNG (requer bpgdec)
Linha de comando:
python -m digital_document_checker cnh.pdf
python -m digital_document_checker cnh.pdf --json --save-photo foto.png
Uso com Docker
A imagem já traz o projeto instalado (clonado no build) com todas as
dependências de leitura de QRCode e PDF (pyzbar/zbar, Pillow, PyMuPDF)
e o bpgdec (libbpg) compilado, habilitando a conversão da foto BPG → PNG
dentro do container.
Build:
docker build -t digital-document-checker .
# opcional: fixar um branch ou tag do repositório
docker build --build-arg GIT_REF=main -t digital-document-checker .
Execução — monte o diretório com seus arquivos em /data:
# saída legível
docker run --rm -v "$PWD:/data" digital-document-checker /data/cnh.pdf
# saída JSON
docker run --rm -v "$PWD:/data" digital-document-checker /data/cnh.pdf --json
# salvar a foto embarcada, convertida para PNG (bpgdec incluso na imagem)
docker run --rm -v "$PWD:/data" digital-document-checker \
/data/cnh.pdf --save-photo /data/foto.png
# ajuda
docker run --rm digital-document-checker --help
A conversão da foto BPG → PNG (
--save-photo *.png) usa obpgdec, que já vem compilado na imagem Docker. Fora do Docker, essa conversão específica exige obpgdec(libbpg) noPATH; sem ele, a foto ainda é extraída em BPG e a extração dos dados e a verificação da assinatura não dependem disso.
O que é verificado
- Envelope — timestamp de emissão + versão (cabeçalho hexadecimal de 10 bytes ou binário de 5 bytes).
- Formato — o parser correto é escolhido pela versão (CNH = versão 2).
- Template —
template_id→ tipo de documento, emissor e grupo de certificados (data/templates.json). - Assinatura digital —
SHA256withRSAouSHA256withECDSAcontra as chaves públicas dedata/certificates.json, considerando a janela de validade do certificado na data de emissão. - Expiração — a partir do campo de validade do próprio documento.
Estrutura
digital_document_checker/
├── checker.py # orquestrador (parse -> verifica -> valida)
├── models.py # DocumentResult, Certificate, Template, Photo, ...
├── registry.py # CertificateStore / TemplateStore (JSONs oficiais)
├── crypto.py # verificação RSA / ECDSA
├── images.py, qr.py # foto embarcada e leitura de QRCode
├── codecs/ # bits, alfabetos 6/7 bits, basE91
├── formats/ # parsers por versão de envelope (2 = CNH, 3 = DNI, ...)
│ ├── envelope.py
│ ├── v2_cnh.py # CNH (verificado)
│ ├── v3_dni.py # DNI (experimental)
│ ├── multiblock.py # versões 4/5/6 (experimental)
│ └── v1_text.py # versão 1 legada (experimental)
├── documents/ # submódulos por tipo de documento
│ ├── cnh.py # CNH <- verificado
│ ├── dni.py # DNI (experimental)
│ ├── rg.py # RG Digital (experimental)
│ └── generic.py
└── data/ # certificates.json, templates.json
Adicionando um novo tipo de documento
from digital_document_checker.documents import register_handler
from digital_document_checker.documents.base import DocumentHandler, DocumentData
class MeuDocHandler(DocumentHandler):
type_name = "meu_doc"
display_name = "Meu Documento"
template_ids = (123,)
def build(self, payload, template):
# payload.field_values -> valores brutos
return DocumentData(raw_fields=payload.field_values, fields={...})
register_handler(MeuDocHandler(), prepend=True)
Notas sobre o formato (engenharia reversa)
- O conteúdo do QRCode é binário transportado como texto Latin-1.
- A CNH (versão 2) empacota os campos em 6 bits por caractere (alfabeto ASCII 32–95), seguidos de 256 bytes de assinatura e da foto em BPG.
- O decodificador de bits desta biblioteca foi validado byte-a-byte contra o decodificador do aplicativo oficial de referência.
- As versões 1, 4, 5 e 6 (outros tipos de documento) têm parsing estrutural implementado, porém ainda não validados contra amostras reais — marcados como experimentais no código.
Disclaimer / Aviso Legal
Leia com atenção antes de utilizar.
Este é um projeto pessoal, desenvolvido de forma independente e sem vínculo com o SERPRO, o SENATRAN, o DENATRAN ou qualquer órgão governamental. Não se trata de uma ferramenta oficial de validação.
O software é fornecido "COMO ESTÁ" ("AS IS"), sem garantias de qualquer natureza, expressas ou implícitas, incluindo — mas não se limitando a — garantias de comercialização, adequação a uma finalidade específica, exatidão, integridade ou não violação.
- O projeto pode conter falhas e bugs. O resultado da verificação pode gerar falsos-negativos e/ou falsos-positivos (por exemplo, apontar como autêntico um documento fraudado, ou como inválido um documento legítimo).
- Os autores e colaboradores NÃO se responsabilizam por qualquer dano, prejuízo, perda financeira, fraude, decisão equivocada ou consequência de qualquer natureza decorrente, direta ou indiretamente, do uso — ou da impossibilidade de uso — desta biblioteca ou de seus resultados.
- O uso é por sua conta e risco. Não utilize este software como única fonte para decisões que envolvam dinheiro, segurança, identidade, obrigações legais ou qualquer situação crítica. Para validação com valor legal, utilize sempre os canais e aplicativos oficiais.
- Os metadados em
data/certificates.jsonedata/templates.jsonsão os dados públicos distribuídos com o aplicativo oficial de validação e podem estar desatualizados. Mantê-los atualizados é responsabilidade do usuário.
Ao utilizar este projeto, você declara estar ciente e de acordo com todos os termos deste aviso. Ferramenta destinada a fins de estudo, pesquisa e verificação técnica.
Testes
pip install -e ".[dev]"
pytest
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file digital_document_checker-0.1.0.tar.gz.
File metadata
- Download URL: digital_document_checker-0.1.0.tar.gz
- Upload date:
- Size: 58.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
286f414ebe143954b859d8cc7e8866ae929634b4cee0ed94b4f2e891188680d2
|
|
| MD5 |
ea5e99b39c4cbe09b6aed1e8ea299673
|
|
| BLAKE2b-256 |
938d6a47db64076d8e13fdfe3cbf35be3b17c4a11947ba7e1bd4a5ee2bee08c7
|