Pular para o conteúdo
ecdsa.com

Ed25519 vs RSA: qual tipo de chave SSH gerar

Para chaves SSH novas, a resposta é Ed25519 há anos. Os motivos que restam para gerar RSA são lacunas de compatibilidade, e elas estão ficando raras.
Itens comparadosEd25519RSA

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

Ed25519RSA-3072
Segurançacerca de 128 bitscerca de 128 bits (RSA-2048: 112)
Chave privadasemente de 32 bytesmódulo de 3072 bits mais os valores do CRT
Chave pública, bruta32 bytesmódulo de 384 bytes mais o expoente
Linha .pub do OpenSSH (medida)86 bytes558 bytes
Assinatura64 bytes384 bytes
Arquivo SSHSIG de uma assinatura (medido)294 bytes1.211 bytes
Geração de chavesmicrossegundoscerca de 100 ms em média, muito variável
Assinaturas / verificações por segundo, OpenSSL 3.6.5cerca de 60.000 / 25.000cerca de 1.000 / 54.000
Nomes de algoritmo no SSHssh-ed25519, sk-ssh-ed25519@openssh.comtipo de chave ssh-rsa; assinaturas rsa-sha2-256, rsa-sha2-512
Suporte no OpenSSHdesde a 6.5 (2014); padrão desde a 9.5 (2023)sempre
Assinaturas determinísticasSimSim no PKCS #1 v1.5, aleatorizadas no PSS
NIST IR 8547 (rascunho)proibido depois de 2035RSA-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.

Comparar chaves e assinaturas SSH Ed25519 e 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"
Saída com o OpenSSH 10.3p1
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.

  1. 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.
  2. Instale-a ao lado da chave antiga: acrescente-a ao authorized_keys de cada servidor, adicione-a à sua conta no serviço de hospedagem Git e ao gerenciamento de configuração, e confirme que consegue fazer login com ssh -i ~/.ssh/id_ed25519.
  3. Nas chaves de host, adicione HostKey /etc/ssh/ssh_host_ed25519_key ao sshd_config; clientes com UpdateHostKeys (ativado por padrão no OpenSSH atual) aprendem a chave nova automaticamente, e as entradas do known_hosts podem ser atualizadas antes de a chave RSA ser removida.
  4. 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.
  5. Se precisar manter o RSA, garanta que o ssh-rsa (SHA-1) não seja reativado em lugar nenhum: procure +ssh-rsa em HostKeyAlgorithms ou PubkeyAcceptedAlgorithms. ssh -Q HostKeyAlgorithms lista o que um cliente aceita, nmap --script ssh2-enum-algos mostra 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

Todas as comparações