Empremta VeriFactu
La cadena d’empremtes SHA-256 que exigeix VeriFactu, calculada en Python i sense ni una dependència.
Llibreries de codi obert · Python · Codi publicat
El problema
Cada registre de facturació ha de portar l’empremta de l’anterior, de manera que alterar una factura vella trenqui totes les que van venir després. És un requisit curt i d’ell depèn que un sistema sencer sigui conforme o no ho sigui: si l’ordre dels camps o el format d’un import no coincideixen amb el que espera l’Agència, l’empremta surt diferent i no salta cap error enlloc.
Què fa
- Calcula l’empremta SHA-256 d’un registre de facturació i manté la cadena que l’uneix a l’anterior.
- Valida el registre contra l’especificació de l’Agència Tributària, versió 0.1.2.
- Reprodueix el vector de prova oficial que publica la mateixa Agència.
- Porta una ordre de consola per encadenar registres i per verificar una cadena ja escrita.
El que es va decidir en construir-lo
- El vector oficial mana sobre el criteri propi
- L’Agència publica un registre d’exemple amb la seva empremta ja calculada, i la biblioteca el reprodueix com a prova. És la diferència entre «hem llegit l’especificació i creiem que està bé» i «dona exactament el que dona la font». Una implementació de hash no es pot validar llegint-la: o coincideix amb el vector, o està malament i sembla bé.
- L’abast es queda a l’empremta, expressament
- No signa, no arma l’XML, no envia i no desa res. Un paquet que prometés les cinc coses obligaria a confiar en les cinc, i la que de debò no es pot tenir malament és aquesta. En deixar-la sola es pot llegir sencera en una tarda i es pot substituir sense tocar la resta del sistema.
- Zero dependències no és minimalisme: és superfície
- Això acaba dins del sistema de facturació d’algú, que és on una cadena de dependències transitives es converteix en un problema que no és seu. Amb la biblioteca estàndard n’hi ha prou, així que es fa servir només la biblioteca estàndard, i el tipatge va inclòs perquè l’error surti en escriure i no en producció.
Fins on arriba
- No signa electrònicament. La signatura XAdES que l’enviament exigeix l’ha de posar un altre component.
- No construeix l’XML de facturació ni envia res a l’Agència: entra un registre i surt una empremta.
- No desa els registres. La conservació, que és una obligació a part, va a càrrec de qui la faci servir.
- No genera el codi QR de la factura.
- 0 dependències
- MIT llicència
- 3.9+ Python
Construït amb
- Python
- SHA-256
- CLI