---
title: "Huella Verifactu: cómo se calcula el hash"
description: "Cómo se calcula la huella encadenada de Verifactu: campos, algoritmo SHA-256, formato de la cadena de texto y un ejemplo paso a paso con datos ficticios."
canonical: https://caricalia.com/notas/huella-verifactu
last-updated: 2026-09-29
---

# Huella Verifactu: cómo se calcula el hash

> La huella de Verifactu es un SHA-256 sobre ocho campos del registro, unidos como nombre=valor e incluyendo la huella anterior. Qué campos, qué formato y un ejemplo completo con datos ficticios.

Publicado: 2026-09-29

Autor: carlos

Temas: verifactu, facturación, huella

---

La huella de Verifactu es un SHA-256 en hexadecimal y en mayúsculas, de 64 caracteres, que se calcula sobre ocho campos del registro de alta (cinco en el de anulación) unidos como nombre=valor con el símbolo &. Uno de esos campos es la huella del registro anterior. Por eso cambiar un registro rompe la cadena entera.

Esta nota explica el cálculo con un ejemplo. La especificación es de la AEAT y no la reproducimos entera: el [documento técnico de la huella](https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Veri-Factu_especificaciones_huella_hash_registros.pdf) (versión 0.1.2, de agosto de 2024) es la fuente. Para el contexto, qué cambia en un software al [adaptarlo a Verifactu](/adaptacion-verifactu) y qué exige cada pieza, está la [guía de Verifactu con software propio](/notas/verifactu-software-propio). Revisada el 29 de septiembre de 2026.

## ¿Qué campos entran en la huella?

Los fija el [artículo 13 de la Orden HAC/1177/2024](https://www.boe.es/buscar/act.php?id=BOE-A-2024-22138) y los detalla la AEAT con el nombre de cada campo en el XML del registro. Siempre en este orden.

| Orden | Registro de alta | Registro de anulación |
|---|---|---|
| 1 | `IDEmisorFactura`, NIF del emisor | `IDEmisorFacturaAnulada` |
| 2 | `NumSerieFactura`, serie y número | `NumSerieFacturaAnulada` |
| 3 | `FechaExpedicionFactura` | `FechaExpedicionFacturaAnulada` |
| 4 | `TipoFactura` | `Huella` del registro anterior |
| 5 | `CuotaTotal` | `FechaHoraHusoGenRegistro` |
| 6 | `ImporteTotal` | |
| 7 | `Huella` del registro anterior | |
| 8 | `FechaHoraHusoGenRegistro` | |

El registro de evento, que solo lleva un sistema en modalidad no Verifactu, tiene su propia lista de nueve campos. No lo tratamos aquí.

Fíjate en lo que no entra: ni el destinatario, ni el desglose de impuestos, ni la descripción. La huella protege un subconjunto pequeño del registro, y el resto de campos se valida por otros medios.

## ¿Cómo se construye la cadena de texto?

Sobre esos campos se construye una única cadena con este formato: `nombreCampo1=valor1&nombreCampo2=valor2&...`. Las reglas de la AEAT son estas:

- **El nombre del campo es el del XML**, tal cual, con sus mayúsculas.
- **El valor es el del XML, sin espacios al principio ni al final.** Los espacios de dentro se conservan: `12345678 / G33` es un valor.
- **Los números tratan igual uno o dos decimales.** `123.1` y `123.10` dan la misma huella, y los ceros a la derecha no cuentan.
- **Un campo sin valor va como `Campo=`,** con el nombre y el igual, sin nada detrás. Es lo que pasa con la huella del registro anterior en el primer registro de la cadena.
- **La cadena se codifica en UTF-8** antes de aplicar el algoritmo.
- **La salida es hexadecimal, en mayúsculas y de 64 caracteres.** Se guarda en el campo `Huella` del propio registro, también en el primero.

El resultado se guarda en el registro y, además, se incluye en el contenido del registro siguiente. Así se forma la cadena.

## Ejemplo paso a paso

Todos los datos de este ejemplo son ficticios: el NIF `B00000000`, las series, las fechas y los importes no corresponden a ninguna empresa ni factura. Los hemos calculado con SHA-256 y puedes reproducirlos con cualquier herramienta que lo implemente. Para comprobar tu implementación con datos oficiales, la AEAT publica tres casos en su documento técnico, y el primero da la huella `3C464DAF61ACB827C65FDA19F352A4E3BDC2C640E9E9FC4CC058073F38F12F60`.

### Registro 1: la primera factura de la cadena

| Campo | Valor |
|---|---|
| `IDEmisorFactura` | `B00000000` |
| `NumSerieFactura` | `A-2027-0001` |
| `FechaExpedicionFactura` | `04-01-2027` |
| `TipoFactura` | `F1` |
| `CuotaTotal` | `21.00` |
| `ImporteTotal` | `121.00` |
| `Huella` (anterior) | vacío, porque es el primero |
| `FechaHoraHusoGenRegistro` | `2027-01-04T10:15:00+01:00` |

La cadena de entrada, con el campo `Huella` vacío, y su huella:

| Dato | Valor |
|---|---|
| Cadena de entrada | `IDEmisorFactura=B00000000&NumSerieFactura=A-2027-0001&FechaExpedicionFactura=04-01-2027&TipoFactura=F1&CuotaTotal=21.00&ImporteTotal=121.00&Huella=&FechaHoraHusoGenRegistro=2027-01-04T10:15:00+01:00` |
| Huella 1 | `BC997D59803C3CFBF15B3B846B2939D52E6182B2832BC88829C16114FC1AD443` |

### Registro 2: la segunda factura, encadenada

Los datos de la segunda factura son ficticios: serie `A-2027-0002`, cuota `10.50`, importe `60.50`, generada a las `10:42:10`. El campo `Huella` del registro anterior ya no está vacío: lleva la huella 1.

| Dato | Valor |
|---|---|
| Cadena de entrada | `IDEmisorFactura=B00000000&NumSerieFactura=A-2027-0002&FechaExpedicionFactura=04-01-2027&TipoFactura=F1&CuotaTotal=10.50&ImporteTotal=60.50&Huella=BC997D59803C3CFBF15B3B846B2939D52E6182B2832BC88829C16114FC1AD443&FechaHoraHusoGenRegistro=2027-01-04T10:42:10+01:00` |
| Huella 2 | `E1C5943DC7D2E72D8587C303200B8A7AA83F7E5D6801F64BD1C36A749740570F` |

### Registro 3: la anulación de la segunda factura

Una anulación usa la lista corta y se encadena a continuación del registro 2, en la misma cadena que las altas.

| Dato | Valor |
|---|---|
| Cadena de entrada | `IDEmisorFacturaAnulada=B00000000&NumSerieFacturaAnulada=A-2027-0002&FechaExpedicionFacturaAnulada=04-01-2027&Huella=E1C5943DC7D2E72D8587C303200B8A7AA83F7E5D6801F64BD1C36A749740570F&FechaHoraHusoGenRegistro=2027-01-04T11:03:45+01:00` |
| Huella 3 | `196FDEC7B0E455A3A24EBAFDEC361DF1B4E92A2CC39BDFE2BFCFD19DB35D1404` |

## ¿Qué pasa si alguien altera un registro?

Supón que alguien cambia el importe del registro 2 de `60.50` a `60.00`. Su huella recalculada pasa a ser `F0FFFD627B6B93E0EB5B710059A6F7ECF3D97A0C4A1D4704B2777A22DFC15E0B`.

Ya no coincide con la que guardó el sistema (`E1C5…570F`), ni con la que el registro 3 lleva dentro como huella anterior. Para ocultarlo habría que recalcular la huella del 2 y reescribir el 3, y luego el 4, y así hasta el último. Si además esos registros ya están en la AEAT, la alteración se ve sin necesidad de comparar nada en tu sistema.

Esto tiene una consecuencia para el diseño: la huella no impide alterar, la huella hace que se note. Impedir la alteración es trabajo del resto del sistema, sin permisos de edición ni borrado sobre facturas emitidas.

## ¿Qué errores se cometen al implementarla?

Los que se deducen de leer el documento de la AEAT con cuidado:

- **Reformatear los valores antes de calcular.** El valor es el del XML. Si el XML dice `04-01-2027`, la cadena dice `04-01-2027`, no `2027-01-04`.
- **Calcular antes de fijar la fecha y la hora.** `FechaHoraHusoGenRegistro` entra en la huella. Si el registro se genera con una hora y se guarda con otra, no cuadra.
- **Olvidar el huso.** La fecha y hora incluyen el huso horario, `+01:00` en invierno y `+02:00` en verano.
- **Dejar el campo `Huella` fuera en el primer registro.** El campo va, vacío, con el igual.
- **Devolver la huella en minúsculas.** La salida es en mayúsculas.
- **Usar un importe distinto del que va en el XML.** `121.0` y `121.00` dan la misma huella. Un redondeo diferente, no.
- **Calcular la huella sobre un objeto y guardar otro.** Lo que se hashea es lo que se emite. Cualquier proceso que retoque el registro después del cálculo invalida la cadena.

Si la huella que informas no coincide con la que calcula la AEAT, el registro no se rechaza. Se marca como aceptado con errores, y hay que subsanarlo. Está en el [documento de validaciones y errores](https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Validaciones_Errores_Veri-Factu.pdf).

## ¿Quién comprueba la huella?

Depende de la modalidad. En Verifactu, la AEAT: cada registro llega y ella lo comprueba, así que el sistema no está obligado a ofrecer comprobaciones. En no Verifactu, el sistema sí. Tiene que poder comprobar la huella de cualquier registro, y la cadena entera o una parte, bajo petición. Y antes de generar un registro nuevo debe comprobar que el último está bien encadenado y que su fecha y hora no superan en más de un minuto la actual ([artículos 6 y 7 de la Orden](https://www.boe.es/buscar/act.php?id=BOE-A-2024-22138)). Las modalidades se comparan en [Verifactu o no Verifactu](/notas/modalidad-verifactu-o-no-verifactu).

## Preguntas frecuentes

### ¿La huella se calcula sobre el XML completo?

No. Solo sobre los ocho campos de un alta o los cinco de una anulación. El resto del registro no entra.

### ¿Qué huella lleva el primer registro?

Calcula la suya como cualquier otro, con la huella anterior vacía en la cadena de entrada, y se marca como primer registro. Solo puede haber uno por cadena.

### ¿Las anulaciones van en una cadena aparte?

No. Altas y anulaciones van en una sola cadena, por cada sistema y por cada obligado a facturar, en el orden en que se generaron. Según la AEAT, un cambio de año o de serie no rompe la cadena.

### ¿Hay algún algoritmo distinto de SHA-256?

Hoy no. El documento de la AEAT dice que el único algoritmo permitido, en la fecha de publicación, es SHA-256.

### ¿Tengo que calcularla yo?

Si tu sistema es propio, sí. Si prefieres no hacerlo, un programa de facturación con API, como [beel.es](https://beel.es), lo calcula por ti. Su documentación técnica está en [docs.beel.es](https://docs.beel.es/verifactu/what-aeat-receives), y no la repetimos aquí.

## Cómo seguir

Si tu sistema calcula ya la huella pero no sabes si la cadena aguanta con dos procesos a la vez, el [diagnóstico](/diagnostico) lo revisa sobre tu código. Y si hay que construirla, es parte de una [adaptación a Verifactu](/adaptacion-verifactu). Qué cambia en un ERP con años encima está en [adaptar un ERP propio a Verifactu](/notas/adaptar-erp-propio-a-verifactu).
