Ed25519 frente a RSA es una duda que surge sobre todo cuando alguien ejecuta ssh-keygen y se pregunta qué -t pasarle. La misma comparación se aplica a la firma de código y de archivos. Ed25519 ofrece seguridad de 128 bits con claves diminutas y firmas rápidas y deterministas; RSA ofrece compatibilidad universal a cambio de un tamaño mucho mayor y de una generación de claves más lenta y más frágil.
De un vistazo
| Ed25519 | RSA-3072 | |
|---|---|---|
| Seguridad | unos 128 bits | unos 128 bits (RSA-2048: 112) |
| Clave privada | semilla de 32 bytes | módulo de 3072 bits más los valores CRT |
| Clave pública, en bruto | 32 bytes | módulo de 384 bytes más el exponente |
Línea .pub de OpenSSH (medida) | 86 bytes | 558 bytes |
| Firma | 64 bytes | 384 bytes |
| Archivo SSHSIG con una firma (medido) | 294 bytes | 1211 bytes |
| Generación de claves | microsegundos | unos 100 ms de media, muy variable |
| Firmas / verificaciones por segundo, OpenSSL 3.6.5 | unas 60.000 / 25.000 | unas 1000 / 54.000 |
| Nombres de algoritmo en SSH | ssh-ed25519, sk-ssh-ed25519@openssh.com | tipo de clave ssh-rsa; firmas rsa-sha2-256, rsa-sha2-512 |
| Compatibilidad en OpenSSH | desde 6.5 (2014); predeterminado desde 9.5 (2023) | siempre |
| Firmas deterministas | Sí | Sí con PKCS #1 v1.5, aleatorizadas con PSS |
| NIST IR 8547 (borrador) | no permitido después de 2035 | RSA-2048 obsoleto después de 2030; todo RSA no permitido después de 2035 |
Valores medidos con OpenSSH 10.3p1 y OpenSSL 3.6.5 en un núcleo de un Apple M4 Max.
Tamaños y velocidad
Al mismo nivel de 128 bits, una clave pública Ed25519 ocupa 32 bytes y un módulo RSA-3072, 384. En SSH, la diferencia se nota en authorized_keys, known_hosts, los certificados y cada handshake: la línea de una clave pública Ed25519 ocupa 86 bytes frente a 558 en RSA-3072, y un archivo de firma SSH separada ocupa 294 bytes frente a 1211.
La velocidad es asimétrica. RSA verifica más rápido que Ed25519 (unas 54.000 operaciones por segundo frente a 25.000 en esta prueba), pero firma unas 60 veces más despacio, y la generación de claves tiene que buscar dos números primos grandes, lo que llevó de media unos 100 ms por clave RSA-3072 en esta máquina y puede tardar mucho más en dispositivos pequeños. En los servidores SSH, que firman un handshake por conexión, las claves de host Ed25519 consumen menos CPU; para los usuarios, ambas son instantáneas.
El script siguiente generó las cifras de tamaño de la tabla; solo usa OpenSSH.
#!/bin/sh
dir=$(mktemp -d)
cd "$dir" || exit 1
ssh-keygen -q -t ed25519 -N "" -C demo -f id_ed25519
ssh-keygen -q -t rsa -b 3072 -N "" -C demo -f id_rsa
for k in id_ed25519 id_rsa; do
echo "$k.pub: $(wc -c < $k.pub | tr -d ' ') bytes"
printf 'hello\n' > "msg-$k"
ssh-keygen -q -Y sign -f "$k" -n file "msg-$k"
echo "signature file: $(wc -c < "msg-$k.sig" | tr -d ' ') bytes"
done
cd / && rm -rf "$dir"
id_ed25519.pub: 86 bytes
signature file: 294 bytes
id_rsa.pub: 558 bytes
signature file: 1211 bytes
Robustez y modos de fallo
Ed25519 tiene pocos parámetros que ajustar: una curva, un hash, nonces deterministas y una única codificación de firma. No hay relleno que elegir ni ningún conjunto de parámetros débil que se pueda seleccionar por accidente.
La historia de RSA es una lista de errores de parámetros y de relleno. El algoritmo de firma ssh-rsa original de SSH calcula el hash con SHA-1, que está roto frente a colisiones de prefijo elegido; OpenSSH 8.8 (septiembre de 2021) lo desactivó por defecto, y las claves RSA firman ahora con rsa-sha2-256 o rsa-sha2-512 (RFC 8332), algo automático con cualquier cliente y servidor actuales. Las claves cortas son otra trampa: el NIST no permite RSA de 1024 bits para firmas desde 2013, y 2048 bits corresponden al nivel de 112 bits del NIST, que el borrador NIST IR 8547 propone declarar obsoleto después de 2030. Los generadores de claves débiles han producido números primos compartidos o con estructura (el fallo ROCA y las claves factorizables mediante batch GCD), un tipo de fallo que no existe para las semillas de Ed25519 mientras el generador de números aleatorios funcione.
Compatibilidad
Ed25519 funciona con OpenSSH 6.5 y posteriores, PuTTY, el OpenSSH integrado en Windows, GitHub, GitLab, Bitbucket, la mayoría de las consolas en la nube, las instancias EC2 con Linux y la firma de commits de Git con SSH. Las carencias notables son las instancias EC2 con Windows, cuyos pares de claves deben ser RSA porque la clave descifra la contraseña inicial del administrador, algunos dispositivos de red e implementaciones SSH embebidas, y el software empresarial muy antiguo. Las claves ed25519-sk respaldadas por FIDO necesitan un autenticador que admita EdDSA; ecdsa-sk es la opción de hardware con más compatibilidad.
RSA funciona en cualquier lugar donde funcione SSH, y esa es su única ventaja real. En los certificados TLS la situación se invierte: las CA de confianza pública emiten certificados RSA y ECDSA, pero no Ed25519, así que esta comparación trata de SSH y de firmas, no de HTTPS.
Cuándo elegir cada uno
- Claves SSH personales y claves de despliegue de CI: Ed25519, protegidas con una frase de contraseña o guardadas en una llave de seguridad (
ssh-keygen -t ed25519-sk). - Claves de host SSH: ofrece Ed25519 primero; mantén una clave de host RSA (solo con
rsa-sha2-*) mientras se conecten clientes antiguos, y planifica su retirada. - Firma de commits y de archivos con claves SSH: Ed25519; las firmas ocupan una quinta parte y la verificación usa el mismo comando.
- Instancias EC2 con Windows, dispositivos heredados, sistemas que no se pueden actualizar: RSA-3072 o RSA-4096.
- Tokens de hardware en modo PIV: lo que admita el token, que a menudo es RSA o ECDSA P-256 y no Ed25519.
- Planificación a largo plazo: ninguno de los dos sobrevive a una computadora cuántica; OpenSSH ya protege las claves de sesión con un intercambio de claves híbrido poscuántico, y OpenSSH 10.4 añadió un tipo de clave compuesto experimental, ML-DSA-44 más Ed25519, para las firmas.
Notas de migración
Sustituir las claves RSA por Ed25519 es una rotación de claves rutinaria.
- Genera la clave nueva con
ssh-keygen -t ed25519 -a 100(más rondas de KDF para la frase de contraseña) o en una llave de seguridad. - Instálala junto a la clave antigua: añádela a
authorized_keysen cada servidor, a tu cuenta del servicio de alojamiento de Git y a la gestión de la configuración, y confirma que puedes iniciar sesión conssh -i ~/.ssh/id_ed25519. - En las claves de host, añade
HostKey /etc/ssh/ssh_host_ed25519_keyasshd_config; los clientes conUpdateHostKeys(activado por defecto en las versiones actuales de OpenSSH) aprenden la clave nueva automáticamente, y las entradas deknown_hostsse pueden actualizar antes de retirar la clave RSA. - Retira la clave RSA de
authorized_keys, de las cuentas y de los agentes cuando ya nada dependa de ella, y revisa los registros en busca de clientes que todavía negocien RSA. - Si tienes que mantener RSA, asegúrate de que
ssh-rsa(SHA-1) no se vuelva a habilitar en ningún sitio: busca+ssh-rsaenHostKeyAlgorithmsoPubkeyAcceptedAlgorithms.ssh -Q HostKeyAlgorithmsmuestra lo que admite un cliente;nmap --script ssh2-enum-algos, lo que ofrece un servidor; y el inspector de claves SSH muestra el tipo, el tamaño y la huella digital de una clave.
Referencias
- RFC 8709, algoritmos de clave pública Ed25519 y Ed448 para SSH
- RFC 8332, uso de claves RSA con SHA-256 y SHA-512 en SSH
- RFC 8032, EdDSA
- Notas de la versión de OpenSSH 8.8 (ssh-rsa desactivado)
- Notas de la versión de OpenSSH 9.5 (Ed25519 predeterminado)
- NIST SP 800-57 Part 1 Rev. 5, tabla 2
- Borrador público inicial de NIST IR 8547
- Amazon EC2: crear un par de claves