Referência: Como identificar um boleto falso
Dá para conferir um boleto sem consultar ninguém, porque a linha digitável confere a si mesma. Os três primeiros dígitos são o código do banco, os dez últimos são o valor em centavos e os quatro anteriores codificam o vencimento. Quatro dígitos verificadores amarram tudo isso, três em módulo 10 e um geral em módulo 11. Dígito verificador é um número extra que só fecha a conta se o resto da linha estiver intacto, então um valor redigitado quase sempre a quebra. O que a conta não prova é legitimidade. Um boleto gerado inteiro pelo golpista carrega dígitos verificadores perfeitos. Para esse caso, o que vale é o app do banco, que consulta o cadastro do título.
O que os 47 dígitos carregam
A linha digitável de um boleto bancário é um rearranjo fixo do código de barras de 44 dígitos. Nesse rearranjo entram três dígitos verificadores, um no fim de cada um dos três primeiros campos, cada um calculado em módulo 10.
O dígito solto no meio da linha é o quarto. Ele é o DV geral do código de barras, em módulo 11, calculado pelo banco emissor sobre exatamente o valor e o vencimento que o resto da linha codifica.
os 47 dígitos, campo a campo
AAABC.CCCCX DDDDD.DDDDDY EEEEE.EEEEEZ K UUUUVVVVVVVVVV
AAA banco X, Y, Z DV de cada campo, módulo 10
B moeda (9 = real) K DV geral do código de barras, módulo 11
UUUU fator de vencimento VVVVVVVVVV valor em centavos
Boletos de arrecadação, os de água, luz e tributos, começam com
8, têm 48 dígitos e organizam os campos de outro jeito. Nada
neste post vale para eles, e o motor também não os lê. Um 8 na
frente é um instrumento diferente, não um boleto bancário malformado.
A conta que pega um valor redigitado
Reconstrua o código de barras a partir da linha impressa, que é um rearranjo fixo, e rode o módulo 11. Se alguém retocou o valor ou o vencimento na linha, a conta deixa de fechar, porque o DV geral foi calculado pelo banco sobre os números originais. A contradição não precisa de decodificador de código de barras, não precisa de pixel e não precisa de segundo documento para comparar. Ela está inteira dentro da própria linha.
É isso que o sinal br-identifier-checksum faz desde o motor
1.21.0, sobre a camada de texto de um PDF digital. As duas fixtures que
justificam a família, ou seja, os dois arquivos de teste, diferem em quatro
dígitos e em nada mais. Uma fica em silêncio. A outra reporta
high, com o achado dizendo que a linha impressa do boleto
discorda do próprio dígito verificador. O guia de
sinais de números descreve a
família inteira.
E a conta sobrevive ao que quase nenhum outro sinal sobrevive. Uma reescrita com qpdf ou Ghostscript lava os sinais de bytes, o histórico de revisões, os metadados. Não muda o que os dígitos imprimem.
Um dígito verificador que falha é evidência. Um que passa não é: qualquer
gerador produz uma linha com todos os DVs corretos, em loop. Por isso a
família reporta falhas e fica em silêncio nos sucessos. E por isso um DV de
campo quebrado sozinho, em módulo 10, sai como medium: erro de
transcrição produz isso com a mesma facilidade que edição.
Por que um DV correto não prova nada
Um golpe não precisa editar um boleto verdadeiro. Pode gerar um boleto novo, estruturalmente impecável, com a linha digitável do golpista apontando para a conta do golpista. Todos os quatro dígitos verificadores fecham, porque foram calculados de verdade, só que sobre os números errados. Nenhuma aritmética sobre a linha pega esse caso, e nenhum sinal estrutural do arquivo pega um documento que nunca foi outro documento.
Para esse caso, a conferência que decide não é conta, é consulta. Escaneie a linha no app do seu banco e leia, na tela de confirmação, o beneficiário que o cadastro do título aponta. O guia percorre essas conferências uma a uma. Este post é sobre a metade que dá para fazer offline, e sobre o que ela vale.
A medição que ninguém publica: 2 linhas em 3.822 PDFs
Antes de construir o resto do plano, o decodificador do código de barras vetorial e o cruzamento de três vias, medi a cobertura no corpus. São 3.822 PDFs públicos, de contratos do PNCP a documentos de bancos e da web brasileira.
| PDFs varridos | 3.822 |
| Páginas com cara de boleto (3+ nomes de campo Febraban) | 63 |
| Dessas, com uma linha digitável de verdade | 2 |
| "Códigos de barras vetoriais" aparentes | 15, e nenhum é código de barras |
Os 63 documentos com cara de boleto são, na esmagadora maioria, manuais de cobrança e especificações de layout CNAB, o formato que os bancos usam para trocar arquivos de cobrança. São documentos sobre boletos, e carregam todos os nomes de campo da Febraban porque são eles que os definem. As duas linhas digitáveis do corpus são exemplos citados dentro de especificações.
E os 15 "códigos de barras" são réguas de tabela, editais e um manual de API, com 1.273 a 3.128 retângulos finos. Eles passam num teste de duas larguras de barra exatamente porque régua de tabela é uniforme. A heurística que devia achar um código de barras achou uma tabela.
A resposta honesta da medição não é uma taxa: é n≈0. E a rota óbvia para consertar isso está fechada de propósito: um boleto real é a cobrança de um estranho, com nome e muitas vezes CPF de quem paga. A regra do corpus deste projeto não é "busque e tome cuidado", é não construir um acervo com as contas dos outros. Por isso o decodificador não foi construído: seria código que não teria como ser validado.
A prova de que o método funciona veio de outro número
A mesma família valida o número de processo judicial do CNJ, que fecha em módulo 97-10, e aí o corpus tinha população de verdade:
| Números reais na máscara canônica | 156, em 34 documentos |
| Verificam em módulo 97-10 | 156 |
| Falsos positivos | 0 |
| Edições de um dígito testadas (156 × 20 posições × 9 dígitos) | 28.080 |
| Pegas pela conta | 23.478 (83,6%) |
| Caem fora do guard de layout, silêncio por desenho | 4.602 (16,4%) |
| Passam como válidas | 0 |
156 números independentes satisfazendo uma identidade de módulo 97 por coincidência tem probabilidade 97⁻¹⁵⁶. Ou seja: a aritmética confere com o que os tribunais realmente emitem, não consigo mesma. E nenhuma edição de um dígito sobre um número real sobrevive à conta. É a mesma classe de verificação que a linha digitável carrega, medida onde havia o que medir.
O outro lado da mesma medição, dito com todas as letras. Sobre as 1.006 falsificações construídas do corpus de tamper, o recall das checagens de PIX e CNJ é zero. Recall é a fração dos casos ruins que a checagem pega: aqui, nenhum.
Aquelas falsificações editam valores, datas e pixels, não redigitam referências. O valor da aritmética está numa classe de documento que o corpus não tem: o comprovante de pagamento e a petição. É por isso que este post existe em vez de um gráfico de recall.
Onde o motor lê, e onde ele fica calado
- Uma sequência solta de 47 dígitos não acusa sozinha. Medido: cerca de 10% das sequências aleatórias de 47 dígitos passam o guard de layout e falhariam um DV. A família teria chamado isso de "alguém editou um boleto". Então uma sequência sem pontuação só é lida numa página com três ou mais nomes de campo da Febraban. A forma pontuada canônica é a única que acusa por si.
- Boleto escaneado ou fotografado não é lido. A camada de texto de um scan é uma transcrição de OCR, feita por leitura automática da imagem, e erro de transcrição quebra DV sem dizer nada sobre fraude. No corpus, 6.179 páginas que são imagem inteira foram puladas de propósito.
- Nada disso é consulta. Nenhum registro é acessado e nada sai do processo. A evidência no relatório carrega só os quatro últimos dígitos de um identificador, porque CPF é dado pessoal e relatório é coisa que se armazena e se encaminha. Saber que onze dígitos satisfazem uma identidade publicada não diz que eles pertencem a alguém.
- O comprovante PIX é o mesmo problema do boleto. O motor valida o CRC-16 de um BR Code quando ele aparece como texto, que é o dígito de conferência do código copia-e-cola do PIX. Mas o corpus não contém nenhum payload PIX, pela mesma razão ética. Então a taxa de falha em comprovantes reais é não medida, e a severidade fica um degrau abaixo do que o plano pedia. O que um comprovante PIX entrega é assunto do guia irmão.
Confira um boleto que você ia pagar mesmo
A conta da linha digitável é sua e custa uma calculadora. O que o motor soma a ela é o resto do arquivo. Quantas vezes o PDF foi gravado, que ferramenta assina os metadados, se há texto por baixo de uma tarja. Sinais, nunca veredictos: um relatório limpo não prova boleto legítimo, e um achado não prova golpe.
Verifique um PDF: grátis, sem conta, o arquivo é analisado em memória e descartado com a resposta.