Saltar al contenido
ecdsa.com

Ed25519 frente a RSA: qué tipo de clave SSH generar

Para las claves SSH nuevas, la respuesta lleva años siendo Ed25519. Las razones que quedan para generar RSA son carencias de compatibilidad, y cada vez son más raras.
Qué se comparaEd25519RSA

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

Ed25519RSA-3072
Seguridadunos 128 bitsunos 128 bits (RSA-2048: 112)
Clave privadasemilla de 32 bytesmódulo de 3072 bits más los valores CRT
Clave pública, en bruto32 bytesmódulo de 384 bytes más el exponente
Línea .pub de OpenSSH (medida)86 bytes558 bytes
Firma64 bytes384 bytes
Archivo SSHSIG con una firma (medido)294 bytes1211 bytes
Generación de clavesmicrosegundosunos 100 ms de media, muy variable
Firmas / verificaciones por segundo, OpenSSL 3.6.5unas 60.000 / 25.000unas 1000 / 54.000
Nombres de algoritmo en SSHssh-ed25519, sk-ssh-ed25519@openssh.comtipo de clave ssh-rsa; firmas rsa-sha2-256, rsa-sha2-512
Compatibilidad en OpenSSHdesde 6.5 (2014); predeterminado desde 9.5 (2023)siempre
Firmas deterministasSíSí con PKCS #1 v1.5, aleatorizadas con PSS
NIST IR 8547 (borrador)no permitido después de 2035RSA-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.

Comparación de claves y firmas SSH Ed25519 y RSA-3072
#!/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"
Salida con OpenSSH 10.3p1
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.

  1. 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.
  2. Instálala junto a la clave antigua: añádela a authorized_keys en 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 con ssh -i ~/.ssh/id_ed25519.
  3. En las claves de host, añade HostKey /etc/ssh/ssh_host_ed25519_key a sshd_config; los clientes con UpdateHostKeys (activado por defecto en las versiones actuales de OpenSSH) aprenden la clave nueva automáticamente, y las entradas de known_hosts se pueden actualizar antes de retirar la clave RSA.
  4. 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.
  5. Si tienes que mantener RSA, asegúrate de que ssh-rsa (SHA-1) no se vuelva a habilitar en ningún sitio: busca +ssh-rsa en HostKeyAlgorithms o PubkeyAcceptedAlgorithms. ssh -Q HostKeyAlgorithms muestra 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

Todas las comparaciones