← RFC Reference

RFC 8463: Ed25519 para firmas DKIM

Standards Track Email Authentication Published March 2026
ELI5: DKIM originalmente usaba claves RSA — el mismo tipo de claves que protegen la mayor parte de la web. Pero las claves RSA son voluminosas: una clave pública de 2048 bits ocupa más de 400 caracteres en un registro TXT de DNS. Ed25519 es una cerradura más nueva y elegante que es igual de fuerte con una clave que cabe en 44 caracteres. Clave más pequeña, verificación más rápida, la misma confianza — eso es lo que RFC 8463 aporta a DKIM.

Por qué existe

DKIM (RFC 6376) originalmente especificaba solo RSA para firmas. RSA ha funcionado bien, pero tiene costos:

Ed25519 (Algoritmo de Firma de Curva de Edwards usando Curve25519) resuelve los tres problemas. Sus claves de 256 bits proporcionan seguridad equivalente a aproximadamente RSA de 3072 bits, la clave pública tiene solo 32 bytes (44 caracteres Base64), y la verificación es significativamente más rápida.

Cómo funciona

Firma con Ed25519

El proceso de firma es idéntico a DKIM estándar, con dos cambios: la etiqueta a= usa ed25519-sha256 en lugar de rsa-sha256, y la clave privada es una clave Ed25519 en lugar de RSA.

  1. Canonicalizar encabezados y cuerpo según las reglas de RFC 6376.
  2. Calcular el hash SHA-256 del cuerpo canonicalizado (etiqueta bh=).
  3. Calcular el hash SHA-256 de los encabezados firmados más el hash del cuerpo.
  4. Firmar el hash del encabezado usando la clave privada Ed25519.
  5. Emitir el encabezado DKIM-Signature con a=ed25519-sha256.

Ejemplo: DKIM-Signature de Ed25519

DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=example.com; s=ed202601; h=from:to:subject:date:message-id:mime-version:content-type; bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; b=Tg2ByC4LSy9F1F6xAQchD8JFh6kYH7aKQjO6Sn7XIkfJVOzv8RBVOzv8QjO6S n7XIkfJV==

Registro de clave pública de DNS

El registro de clave usa k=ed25519 y la clave pública es dramáticamente más pequeña que RSA:

; Clave DKIM Ed25519 — nota lo compacto del valor p= ed202601._domainkey.example.com. IN TXT "v=DKIM1; k=ed25519; p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=" ; Comparar con clave RSA de 2048 bits — mucho más grande rsa202601._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2UMfREvlgajdSp3jv1oI...truncated (392 characters)..."

Firma dual: el enfoque recomendado

No todos los receptores admiten Ed25519 aún. RFC 8463 recomienda firma dual: aplicar tanto una firma RSA como una firma Ed25519 a cada mensaje. Los receptores que entienden Ed25519 pueden verificar la firma más fuerte; los que no la entienden recurrirán a la firma RSA.

; Un mensaje con dos encabezados DKIM-Signature: DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=example.com; s=ed202601; h=from:to:subject:date:message-id; bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; b=Tg2ByC4LSy9F1F6xAQchD8JFh6kYH7aK... DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=rsa202601; h=from:to:subject:date:message-id; bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; b=LjIEJLNOTAREALh8gAiGVQOr3K7qO6Sn7XIkfJV...

Ambas firmas comparten el mismo bh= (hash del cuerpo) y h= (encabezados firmados) pero usan selectores diferentes que apuntan a tipos de clave diferentes en DNS.

Detalles técnicos clave

Comparación del tamaño de clave

Propiedad RSA-2048 Ed25519
Nivel de seguridad (bits) ~112 ~128
Tamaño de clave pública (Base64) ~392 caracteres 44 caracteres
Tamaño de firma (Base64) ~344 caracteres 88 caracteres
Velocidad de firma Moderada Rápida
Velocidad de verificación Rápida Muy rápida
Tamaño del registro TXT de DNS Ajuste apretado, puede necesitar división Cabe fácilmente en una sola cadena

Generación de clave

# Generar un par de claves Ed25519 usando OpenSSL 1.1.1+ openssl genpkey -algorithm Ed25519 -out ed25519_private.pem # Extraer la clave pública openssl pkey -in ed25519_private.pem -pubout -out ed25519_public.pem # Obtener la clave pública Base64 sin formato para DNS (eliminar encabezados PEM) openssl pkey -in ed25519_private.pem -pubout -outform DER | tail -c 32 | base64 11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo= # Publicar en DNS como: # ed202601._domainkey.example.com. IN TXT "v=DKIM1; k=ed25519; p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="

Formato de registro de DNS

El único cambio respecto a un registro de clave DKIM estándar es k=ed25519. Todas las demás etiquetas (v=, p=, t=, etc.) funcionan igual que con registros de clave RSA:

; Etiquetas requeridas v=DKIM1 ; versión (siempre DKIM1) k=ed25519 ; tipo de clave (era "rsa" por defecto) p=<base64> ; clave pública de 44 caracteres ; Etiquetas opcionales (igual que RSA) t=s ; modo estricto: d= debe coincidir exactamente con el dominio From t=y ; modo de prueba: los receptores no deben tratar los fallos como definitivos

Comportamiento del receptor

Cuando un receptor encuentra a=ed25519-sha256 en un DKIM-Signature:

  1. Buscar el registro de clave DNS para el selector.
  2. Confirmar k=ed25519 en el registro de clave.
  3. Decodificar la clave pública de 32 bytes de la etiqueta p=.
  4. Verificar la firma Ed25519 contra el hash SHA-256 de los encabezados canonicalizados.

Si el receptor no admite Ed25519, trata la firma como no verificable (no un error grave) y continúa con cualquier otro encabezado DKIM-Signature en el mensaje.

Errores comunes

Impacto en la entregabilidad

Related RFCs