A questão Ed25519 vs RSA surge com mais frequência quando alguém roda ssh-keygen e se pergunta qual -t passar. A mesma comparação vale para a assinatura de código e de arquivos. O Ed25519 oferece segurança de 128 bits com chaves minúsculas e assinaturas rápidas e determinísticas; o RSA oferece compatibilidade universal, com um tamanho muito maior e uma geração de chaves mais lenta e mais frágil.
Visão geral
| Ed25519 | RSA-3072 | |
|---|---|---|
| Segurança | cerca de 128 bits | cerca de 128 bits (RSA-2048: 112) |
| Chave privada | semente de 32 bytes | módulo de 3072 bits mais os valores do CRT |
| Chave pública, bruta | 32 bytes | módulo de 384 bytes mais o expoente |
Linha .pub do OpenSSH (medida) | 86 bytes | 558 bytes |
| Assinatura | 64 bytes | 384 bytes |
| Arquivo SSHSIG de uma assinatura (medido) | 294 bytes | 1.211 bytes |
| Geração de chaves | microssegundos | cerca de 100 ms em média, muito variável |
| Assinaturas / verificações por segundo, OpenSSL 3.6.5 | cerca de 60.000 / 25.000 | cerca de 1.000 / 54.000 |
| Nomes de algoritmo no SSH | ssh-ed25519, sk-ssh-ed25519@openssh.com | tipo de chave ssh-rsa; assinaturas rsa-sha2-256, rsa-sha2-512 |
| Suporte no OpenSSH | desde a 6.5 (2014); padrão desde a 9.5 (2023) | sempre |
| Assinaturas determinísticas | Sim | Sim no PKCS #1 v1.5, aleatorizadas no PSS |
| NIST IR 8547 (rascunho) | proibido depois de 2035 | RSA-2048 descontinuado depois de 2030; todo RSA proibido depois de 2035 |
Valores medidos com o OpenSSH 10.3p1 e o OpenSSL 3.6.5 em um núcleo de um Apple M4 Max.
Tamanhos e velocidade
No mesmo nível de 128 bits, uma chave pública Ed25519 tem 32 bytes, e um módulo RSA-3072 tem 384. No SSH, a diferença aparece no authorized_keys, no known_hosts, nos certificados e em cada handshake: a linha de uma chave pública Ed25519 tem 86 bytes, contra 558 da RSA-3072, e um arquivo separado de assinatura SSH tem 294 bytes, contra 1.211.
A velocidade é assimétrica. O RSA verifica mais rápido que o Ed25519 (cerca de 54.000 contra 25.000 operações por segundo aqui), mas assina cerca de 60 vezes mais devagar, e a geração de chaves precisa procurar dois primos grandes, o que levou em média cerca de 100 ms por chave RSA-3072 nesta máquina e pode levar muito mais em dispositivos pequenos. Para servidores SSH, que assinam um handshake a cada conexão, chaves de host Ed25519 gastam menos CPU; para os usuários, as duas são instantâneas.
O script abaixo gerou os números de tamanho da tabela; ele usa apenas o 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 e modos de falha
O Ed25519 tem poucas opções configuráveis: uma curva, um hash, nonces determinísticos, uma codificação de assinatura. Não há padding para escolher nem conjunto de parâmetros fraco para selecionar por acidente.
A história do RSA é uma lista de erros de parâmetros e de padding. O algoritmo de assinatura original do SSH, ssh-rsa, calcula o hash com SHA-1, que está quebrado para colisões de prefixo escolhido; o OpenSSH 8.8 (setembro de 2021) o desativou por padrão, e as chaves RSA agora assinam com rsa-sha2-256 ou rsa-sha2-512 (RFC 8332), o que acontece automaticamente com qualquer cliente e servidor atuais. Chaves curtas são outra armadilha: o NIST não permite RSA de 1024 bits para assinaturas desde 2013, e 2048 bits correspondem ao nível de 112 bits do NIST, que o rascunho do NIST IR 8547 propõe descontinuar depois de 2030. Geradores de chaves fracos já produziram primos compartilhados ou estruturados (a falha ROCA e chaves fatoráveis pelo cálculo do MDC em lote, o batch GCD), uma classe de falha que não existe para sementes Ed25519, desde que o gerador de números aleatórios funcione.
Compatibilidade
O Ed25519 funciona com o OpenSSH 6.5 e versões posteriores, o PuTTY, o OpenSSH integrado ao Windows, o GitHub, o GitLab, o Bitbucket, a maioria dos consoles de nuvem, instâncias EC2 Linux e a assinatura de commits do Git via SSH. As lacunas notáveis são as instâncias EC2 Windows, cujos pares de chaves precisam ser RSA porque a chave descriptografa a senha inicial da conta Administrator, alguns appliances de rede e implementações SSH embarcadas, e softwares corporativos muito antigos. Chaves ed25519-sk baseadas em FIDO precisam de um autenticador com suporte a EdDSA; ecdsa-sk é a opção de hardware com suporte mais amplo.
O RSA funciona em todo lugar onde o SSH funciona, e essa é a sua única vantagem real. Nos certificados TLS, a situação se inverte: as CAs de confiança pública emitem certificados RSA e ECDSA, mas não Ed25519, então esta comparação trata de SSH e de assinatura, e não de HTTPS.
Quando escolher cada um
- Chaves SSH pessoais e chaves de implantação de CI: Ed25519, protegidas por uma frase secreta ou guardadas em uma chave de segurança (
ssh-keygen -t ed25519-sk). - Chaves de host SSH: ofereça Ed25519 primeiro; mantenha uma chave de host RSA (só com
rsa-sha2-*) enquanto clientes antigos se conectarem e planeje a remoção dela. - Assinatura de commits e de arquivos com chaves SSH: Ed25519; as assinaturas têm um quinto do tamanho, e a verificação usa o mesmo comando.
- Instâncias EC2 Windows, appliances legados, sistemas que não podem ser atualizados: RSA-3072 ou RSA-4096.
- Tokens de hardware em modo PIV: o que o token aceitar, que muitas vezes é RSA ou ECDSA P-256, e não Ed25519.
- Planejamento a longo prazo: nenhum dos dois resiste a um computador quântico; o OpenSSH já protege as chaves de sessão com uma troca de chaves híbrida pós-quântica, e o OpenSSH 10.4 acrescentou um tipo de chave composto experimental, ML-DSA-44 mais Ed25519, para assinaturas.
Notas de migração
Substituir chaves RSA por Ed25519 é uma rotação de chaves de rotina.
- Gere a chave nova com
ssh-keygen -t ed25519 -a 100(mais rodadas de KDF para a frase secreta) ou em uma chave de segurança. - Instale-a ao lado da chave antiga: acrescente-a ao
authorized_keysde cada servidor, adicione-a à sua conta no serviço de hospedagem Git e ao gerenciamento de configuração, e confirme que consegue fazer login comssh -i ~/.ssh/id_ed25519. - Nas chaves de host, adicione
HostKey /etc/ssh/ssh_host_ed25519_keyaosshd_config; clientes comUpdateHostKeys(ativado por padrão no OpenSSH atual) aprendem a chave nova automaticamente, e as entradas doknown_hostspodem ser atualizadas antes de a chave RSA ser removida. - Remova a chave RSA do
authorized_keys, das contas e dos agentes quando nada mais depender dela, e procure nos logs clientes que ainda negociam RSA. - Se precisar manter o RSA, garanta que o
ssh-rsa(SHA-1) não seja reativado em lugar nenhum: procure+ssh-rsaemHostKeyAlgorithmsouPubkeyAcceptedAlgorithms.ssh -Q HostKeyAlgorithmslista o que um cliente aceita,nmap --script ssh2-enum-algosmostra o que um servidor oferece, e o inspetor de chaves SSH exibe o tipo, o tamanho e a impressão digital de uma chave.
Referências
- RFC 8709, algoritmos de chave pública Ed25519 e Ed448 para SSH
- RFC 8332, uso de chaves RSA com SHA-256 e SHA-512 no SSH
- RFC 8032, EdDSA
- Notas de versão do OpenSSH 8.8 (ssh-rsa desativado)
- Notas de versão do OpenSSH 9.5 (Ed25519 como padrão)
- NIST SP 800-57 Parte 1 Rev. 5, tabela 2
- Rascunho público inicial do NIST IR 8547
- Amazon EC2: criar um par de chaves