Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

03 - Troca de Chave de Sessão

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

A Troca de Chave de Sessão (ou Key Exchange - KEX) é o momento técnico onde o segredo da criptografia é gerado. No SSH, isso é feito de forma que um atacante observando a rede não consiga descobrir a chave, mesmo capturando todos os pacotes.

1. O Algoritmo Diffie-Hellman (DH)

O método padrão para a troca de chaves é o Diffie-Hellman (ou sua versão moderna ECDH - Elliptic Curve Diffie-Hellman).

O processo simplificado funciona assim:
1. Chave de Host (Host Key): O servidor envia sua chave pública para o cliente. O cliente verifica se confia nela (conferindo o arquivo known_hosts).
2. Valores Temporários: Cada lado gera um par de chaves temporárias (efêmeras) e trocam os valores públicos entre si.
3. Cálculo do Segredo: Através de propriedades matemáticas complexas, tanto o cliente quanto o servidor calculam o mesmo valor final, sem que esse valor tenha sido enviado pela rede.

Fundamento Matemático do DH

A mágica do Diffie-Hellman está na propriedade comutativa da exponenciação modular:

Públicos: p (primo grande), g (gerador)
Alice escolhe a (privado), envia A = g^a mod p
Bob   escolhe b (privado), envia B = g^b mod p
Segredo compartilhado: S = B^a mod p = A^b mod p = g^(ab) mod p

Um atacante que capture A e B na rede não consegue calcular S sem conhecer a ou b, o que exigiria resolver o problema do logaritmo discreto — computacionalmente intratável para números de 2048+ bits.

2. A Chave de Sessão (Session Key)

A partir do segredo gerado pelo Diffie-Hellman, o SSH deriva Chaves de Sessão Simétricas (usando algoritmos como SHA-256). Estas chaves são usadas para:
- Criptografar o tráfego (ex: usando AES).
- Gerar os MACs (Message Authentication Codes) para garantir a integridade.

A partir deste momento, todo o tráfego da rede está criptografado. O que quer que o cliente envie agora (como sua senha) será invisível para qualquer um no meio do caminho.

Derivação de Múltiplas Chaves

O SSH deriva 6 chaves distintas a partir do segredo compartilhado (definidas na RFC 4253):

Chave Função Direção
IV Cliente → Servidor Vetor de inicialização (cifra) C→S
IV Servidor → Cliente Vetor de inicialização (cifra) S→C
Chave de Cifra C→S Criptografia de dados C→S
Chave de Cifra S→C Criptografia de dados S→C
Chave de MAC C→S Integrity/autenticação C→S
Chave de MAC S→C Integrity/autenticação S→C

A separação direcional previne ataques de reflexão, onde um atacante reverteria pacotes de uma direção na outra.


3. Perfect Forward Secrecy (PFS)

Como as chaves efêmeras usadas no Diffie-Hellman são descartadas assim que a sessão termina, o SSH garante a Sigilo Direto Perfeito.
- Se um atacante capturar e guardar o tráfego criptografado hoje e, daqui a um ano, conseguir roubar a Chave de Host do servidor, ele ainda assim não conseguirá descriptografar os dados salvos.
- Isso ocorre porque a chave de host foi usada apenas para Autenticação (provar que o servidor é ele mesmo), mas não para a Criptografia dos dados.

4. Algoritmos KEX Suportados

O SSH-2 (RFC 4253) permite múltiplos algoritmos de troca de chaves. Os principais são:

Algoritmo Curva/Grupo RFC Status Moderno
diffie-hellman-group1-sha1 Oakley Group 2 (1024-bit) RFC 4253 Obsoleto (inseguro)
diffie-hellman-group14-sha1 Oakley Group 14 (2048-bit) RFC 4253 Aceitável, mas SHA-1 fraco
diffie-hellman-group14-sha256 2048-bit + SHA-256 RFC 8268 Recomendado mínimo
diffie-hellman-group16-sha512 4096-bit + SHA-512 RFC 8268 Recomendado alto
diffie-hellman-group18-sha512 8192-bit + SHA-512 RFC 8268 Recomendado máximo
ecdh-sha2-nistp256 NIST P-256 (ECDH) RFC 5656 Recomendado
ecdh-sha2-nistp384 NIST P-384 (ECDH) RFC 5656 Recomendado alto
curve25519-sha256 Curve25519 RFC 8731 Recomendado padrão
curve25519-sha256@libssh.org Curve25519 (variante) Proposta OpenSSH Recomendado
sntrup761x25519-sha512@openssh.com Pós-quântico híbrido OpenSSH 8.5+ Resistente a Shor

5. Curve25519 - O Padrão Moderno

A Curve25519 foi projetada por Daniel J. Bernstein em 2005 e é hoje a escolha padrão do OpenSSH por:

  • Performance: Mais rápida que RSA e ECDH-NIST em software.
  • Segurança contra timing attacks: Implementação naturalmente resistente a ataques de canal lateral.
  • Sem suspeitas de backdoor: Ao contrário das curvas NIST (que tiveram coeficientes escolhidos pela NSA sem justificativa pública), a Curve25519 tem parâmetros matemáticos transparentes.
  • Tamanho compacto: Apenas 32 bytes por chave pública.

Exemplo de Configuração no sshd_config

# /etc/ssh/sshd_config
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512

6. RSA Key Exchange (Obsoleto)

Versões antigas do SSH suportavam rsa-key-exchange, onde a chave de sessão era gerada pelo cliente e enviada cifrada com a chave pública RSA do servidor. Esse modelo não oferece Perfect Forward Secrecy — se a chave privada do servidor for comprometida no futuro, todas as sessões gravadas poderão ser descriptografadas.

Por isso, o RSA KEX foi removido do OpenSSH 8.2+ em 2020.

7. ED25519 - O Futuro das Chaves de Host

A mesma curva Curve25519 que serve para KEX também é usada para gerar chaves de assinatura Ed25519 (RFC 8032). Vantagens sobre RSA:

  • Chaves públicas de apenas 32 bytes (vs 256 bytes de RSA-2048).
  • Assinaturas de 64 bytes (vs 256 bytes de RSA-2048).
  • Verificação e geração extremamente rápidas.
  • Resistente a colisões conhecidas em SHA-1.
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519

O parâmetro -a 100 aplica 100 rodadas de KDF (Key Derivation Function) sobre a passphrase, dificultando ataques de força bruta offline.

8. ECDSA - A Alternativa NIST

O ECDSA (Elliptic Curve Digital Signature Algorithm) usa as curvas NIST P-256, P-384 e P-521 para gerar chaves de assinatura. Embora seja mais rápido e compacto que o RSA, há suspeitas históricas de que coeficientes das curvas NIST foram escolhidos pela NSA para permitir backdoors. Por isso, a comunidade prefere Ed25519 quando disponível.

ssh-keygen -t ecdsa -b 521 -f ~/.ssh/id_ecdsa

9. Troca de Chaves em Alta Velocidade (Rekey)

Para limitar o impacto de um eventual vazamento de chave de sessão, o SSH faz rekeying automático:

  • Após 1 GB de dados trafegados.
  • Após 1 hora de sessão ativa.

Esses limites são configuráveis no sshd_config:

RekeyLimit 1G 1h

10. Resumo Técnico

Atributo Valor
Fase SSH Transport layer (RFC 4253)
Algoritmo padrão Curve25519 (moderno)
Algoritmo legado DH Group 14/18
Propriedade crítica Perfect Forward Secrecy
Chaves derivadas 6 (IV+Cifra+MAC em cada direção)
Rekeying A cada 1GB ou 1h
Resistente a Shor Apenas sntrup761x25519

11. Conclusão

A troca de chaves é o coração criptográfico do SSH. Sem ela, qualquer um na rede poderia ler senhas e comandos. O uso de Diffie-Hellman efêmero, complementado pelas modernas curvas Curve25519 e Ed25519, garante propriedades de segurança fortes como Perfect Forward Secrecy e resistência a ataques quânticos. Compreender esses algoritmos é essencial para configurar servidores SSH robustos e compatíveis com as melhores práticas modernas.