Algoritmo criptográfico

Hash SHA-256 VeriFactu: cálculo y encadenamiento

Algoritmo y procedimiento de cálculo del hash y el encadenamiento de registros VeriFactu según la especificación oficial AEAT. SHA-256 sobre cadena UTF-8 con formato campo=valor&campo=valor, salida hex de 64 caracteres, encadenamiento por fecha. Con ejemplo de cadena pre-hash, comparación con blockchain y librerías open source verificadas.

El hash de cada registro VeriFactu se calcula con el algoritmo SHA-256 sobre una cadena ASCII/UTF-8 con el formato nombreCampo1=valorCampo1&nombreCampo2=valorCampo2&.... La salida es una cadena hexadecimal de 64 caracteres. Cada registro N+1 incluye en su cálculo el hash del registro N (campo Huella), creando una cadena inalterable. Especificación oficial en Veri-Factu_especificaciones_huella_hash_registros.pdf publicada por la AEAT.

— Cadena pre-hash

Cómo se construye la cadena antes del hash

Para un registro de alta de factura, el orden estricto de campos es:

  1. 1. IDEmisorFactura — NIF emisor
  2. 2. NumSerieFactura — número y serie
  3. 3. FechaExpedicionFactura — dd-mm-yyyy
  4. 4. TipoFactura — código catálogo AEAT (F1, F2, R1-R5, etc.)
  5. 5. CuotaTotal — importe IVA
  6. 6. ImporteTotal — importe total
  7. 7. Huella — hash del registro anterior (vacío en el primero)
  8. 8. FechaHoraHusoGenRegistro — ISO-8601 con huso (ej. 2024-01-01T19:20:30+01:00)

Ejemplo de cadena pre-hash para el primer registro de la cadena (con Huella vacío):

IDEmisorFactura=89890001K&NumSerieFactura=12345678/G33&FechaExpedicionFactura=01-01-2024&TipoFactura=F1&CuotaTotal=12.35&ImporteTotal=123.45&Huella=&FechaHoraHusoGenRegistro=2024-01-01T19:20:30+01:00

Esta cadena se convierte a bytes UTF-8 y se le aplica SHA-256. La salida (64 chars hex) pasa a ser el campo Huella del registro siguiente.

Para un registro de anulación, los campos son: 1) IDEmisorFacturaAnulada, 2) NumSerieFacturaAnulada, 3) FechaExpedicionFacturaAnulada, 4) Huella (anterior), 5) FechaHoraHusoGenRegistro.

Fuentes: AEAT — Algoritmo cálculo huella/hash, Orden HAC/1177/2024.

— Encadenamiento

Cómo se enlazan los registros entre sí

El encadenamiento es lo que da la propiedad de inalterabilidad al sistema. Cada registro N+1 incluye en su campo Huella el hash del registro N. Si alguien modifica un campo del registro N, el SHA-256 que se calculaba antes ya no coincide, y por tanto el campo Huella del registro N+1 (que es el SHA-256 antiguo) deja de cuadrar con el N actualizado. La cadena se rompe desde N en adelante.

  • El encadenamiento es por fecha de generación del registro, no por número de factura ni por tipo. Un registro de anulación puede encadenar con un alta sin problema.
  • El primer registro de la cadena tiene Huella= (vacío), creando el ancla inicial.
  • En modalidad VERI*FACTU, la AEAT actúa como ancla temporal externa: aunque el atacante regenerara toda la cadena local, la AEAT detecta la divergencia con sus registros.
  • En modalidad No-VERI*FACTU, además del hash se exige firma electrónica de cada registro (formato XAdES) para garantizar la integridad sin la red AEAT como ancla.
— Comparación con blockchain

¿Es VeriFactu blockchain?

No técnicamente. Comparte el concepto de hash chain con blockchain, pero le falta el elemento de consenso distribuido. VeriFactu es una hash chain centralizada con la AEAT como ancla única — el mismo patrón estructural que usa Git para sus commits.

CaracterísticaVeriFactuBlockchain (ej. Bitcoin)
Encadenamiento por hash
AlgoritmoSHA-256SHA-256 (doble SHA-256 en BTC)
ValidadorAEAT (autoridad central)Red distribuida P2P
InmutabilidadPor trazabilidad: alterar deja rastroPor consenso distribuido
Coste por registro0 (envío SOAP a AEAT)Variable (fees)
Privacidad de datosSolo AEAT, emisor y receptorPseudónima en cadena pública
Modelo conceptualHash chain centralizadaDistributed ledger

— FAQ

Preguntas frecuentes sobre el hash y encadenamiento VeriFactu

Algoritmo, formato de la cadena pre-hash, encadenamiento y comparación con blockchain.

Ver todas las preguntas
¿Qué algoritmo de hash usa VeriFactu?+
SHA-256, sobre una cadena UTF-8 con formato campo=valor concatenados por ampersand. La salida es una cadena hexadecimal de 64 caracteres. La especificación AEAT indica explícitamente por el momento SHA-256 (sugiriendo que pueda evolucionar si se descubrieran colisiones). Documento técnico: Veri-Factu_especificaciones_huella_hash_registros.pdf en sede.agenciatributaria.gob.es.
¿Qué campos entran en el cálculo del hash en un registro de alta?+
Para un registro de alta de factura, los campos a hashear en orden estricto son: 1) IDEmisorFactura (NIF emisor), 2) NumSerieFactura, 3) FechaExpedicionFactura, 4) TipoFactura, 5) CuotaTotal, 6) ImporteTotal, 7) Huella (hash del registro anterior), 8) FechaHoraHusoGenRegistro (ISO-8601 con huso horario). Se concatenan con el formato campo=valor separados por ampersand. Si es el primer registro de la cadena, Huella va vacío.
¿Cómo funciona el encadenamiento entre registros?+
Cada registro N+1 incluye en sus campos a hashear el valor del campo Huella con el hash del registro N. Modificar un campo del registro N rompe la cadena desde N en adelante, porque el siguiente registro tendría una Huella basada en datos antiguos. El encadenamiento se hace por fecha de generación del registro (campo FechaHoraHusoGenRegistro), no por número de factura ni por tipo. Un registro de anulación puede encadenar con un registro de alta sin problema.
¿Qué pasa con el primer registro de la cadena?+
El campo Huella se incluye en la concatenación pero con valor vacío. La cadena pre-hash para el primer registro contendría "...&Huella=&FechaHoraHusoGenRegistro=...". Esto crea el ancla inicial. El siguiente registro tomará el SHA-256 calculado y lo pondrá como su Huella.
¿VeriFactu es blockchain?+
No, técnicamente no. Comparte el concepto de hash chain con blockchain (encadenamiento por hash, inmutabilidad), pero le falta el elemento de consenso distribuido. VeriFactu es una hash chain centralizada con la AEAT como ancla única. El mismo patrón estructural lo usa Git para sus commits. Llamarlo blockchain es marketing-divulgativo, no técnico.
¿Cómo se trata una factura rectificativa en el encadenamiento?+
Una factura rectificativa (tipos R1-R5 del catálogo AEAT) genera un nuevo registro de alta que se encadena con el último registro de la cadena por fecha de generación. No anula la factura original. Si se quiere anular la original, se emite un registro de anulación separado, también encadenado por fecha. Rectificativa y anulación son eventos distintos en el registro AEAT.
¿Las modalidades VERI*FACTU y No-VERI*FACTU usan el mismo hash?+
Sí, el algoritmo y la cadena pre-hash son idénticos. La diferencia está en si se envían los registros a la AEAT en tiempo real (VERI*FACTU) o se guardan localmente (No-VERI*FACTU). En modalidad No-VERI*FACTU se exige además firma electrónica del registro (formato XAdES) para garantizar la integridad sin la red AEAT como ancla; en VERI*FACTU basta el hash porque el envío a la AEAT actúa de ancla temporal.
¿Puedo verificar manualmente el hash de un registro?+
Sí. Reconstruir la cadena pre-hash con los campos en el orden correcto, codificarla en UTF-8 y calcular SHA-256. Cualquier librería estándar (openssl, hashlib en Python, java.security.MessageDigest, crypto.subtle en JavaScript) sirve. El resultado debe coincidir exactamente con el hash que aparece en el registro emitido. Para verificación de cadena completa, recomendables las librerías open source verifactu-aeat.github.io, hectorsipe/aeat-verifactu o mdiago/VeriFactu.
Empezar · Respuesta en 24h

¿Te toca implementar el algoritmo en tu sistema?

Si fabricas software o tu equipo necesita implementar el cálculo de hash y encadenamiento conforme a la Orden HAC/1177/2024, podemos ayudarte con el desarrollo y la verificación contra el entorno de pruebas AEAT.

Demo personalizada
Sin compromiso
Equipo en España