CÓDIGO DA DISCIPLINA: DEE345
Departamento de Engenharias e Exatas - UFPR/Palotina
Docente de Segurança da Informação
Cada entidade possui uma chave privada (sigilosa) e uma chave pública (distribuída). A segurança baseia-se na dificuldade de inverter certas operações matemáticas, segurança robusta, conforme LGPD e PNSI.
A chave pública cifra ou verifica; a privada decifra ou assina.
Algoritmo clássico baseado na fatoração de grandes primos.
# Gerar par RSA-4096
openssl genpkey -algorithm RSA -out rsa_priv.pem -pkeyopt rsa_keygen_bits:4096
# Extrair pública
openssl rsa -pubout -in rsa_priv.pem -out rsa_pub.pem
# Inspecionar par de chaves
openssl pkey -in rsa_priv.pem -text -noout
# Cifrar / Decifrar
openssl pkeyutl -encrypt -pubin -inkey rsa_pub.pem -in msg.txt -out msg.rsa
openssl pkeyutl -decrypt -inkey rsa_priv.pem -in msg.rsa -out msg.dec
Notícia: Em 2009, a fatoração de RSA-768 (232 dígitos) levou meses de cálculo em super-computadores¹.
Em 2009, um esforço colaborativo internacional alcançou um feito notável na história da segurança digital: a fatoração do RSA-768, um número de 232 dígitos. Este evento demonstrou de forma prática a evolução do poder computacional e a necessidade de adotar chaves criptográficas cada vez mais fortes.
O RSA-768 era um número semi-primo (produto de dois números primos grandes) da "RSA Factoring Challenge", uma competição criada para testar os limites da segurança do algoritmo RSA. Quebrar a chave significava encontrar esses dois fatores primos.
A fatoração levou cerca de dois anos para ser concluída por uma equipe de pesquisadores de diversas instituições. O poder de processamento necessário foi equivalente a aproximadamente 2000 anos de cálculo em um único núcleo de processador, distribuído entre centenas de máquinas.
O sucesso da fatoração provou que chaves RSA de 768 bits não eram mais seguras para proteger informações importantes a longo prazo. Isso acelerou a migração da indústria para chaves mais fortes, consolidando o RSA de 2048 bits como o novo padrão mínimo de segurança para aplicações como sites HTTPS.
Oferece segurança equivalente a RSA com chaves muito menores — ideal para IoT e dispositivos limitados.
# Gerar chave ECC na curva prime256v1
openssl ecparam -name prime256v1 -genkey -noout -out ecc_priv.pem
# Extrair pública
openssl ec -in ecc_priv.pem -pubout -out ecc_pub.pem
# Inspecionar curva e parâmetros
openssl ecparam -in ecc_priv.pem -text -noout
Comparação: ECC-256 bits ≈ RSA-3072 bits em segurança².
keybase pgp gen
. keybase.ioNota: O ataque ao Banco do Brasil (2023) explorou RSA-1024, mitigável com ECC-256.
Prática: Gere chaves RSA e ECC com PuTTYgen e compare com OpenSSL. Publique uma chave pública via Keybase.
Permite derivar um segredo compartilhado sem transmitir diretamente a chave, essencial para TLS e VPNs.
# Gerar parâmetros DH
openssl dhparam -out dhparam.pem 2048
# Cada parte gera sua chave
openssl genpkey -paramfile dhparam.pem -out dh1.pem
openssl genpkey -paramfile dhparam.pem -out dh2.pem
# Extrair públicas
openssl pkey -in dh1.pem -pubout -out dh1_pub.pem
openssl pkey -in dh2.pem -pubout -out dh2_pub.pem
# Derivar segredo
openssl pkeyutl -derive -inkey dh1.pem -peerkey dh2_pub.pem -out secret1.bin
openssl pkeyutl -derive -inkey dh2.pem -peerkey dh1_pub.pem -out secret2.bin
# secret1.bin == secret2.bin
Aplicação prática em TLS: ECDHE em HTTPS usa variações baseadas em curvas elípticas.
tls.handshake.type == 2
. wireshark.orgPrática: Capture uma sessão HTTPS com Wireshark e analise ECDHE. Simule DH em Cryptool com chaves pequenas.
Wireshark + ECDHE + CrypTool
ssl or tls or port 443
Aplicar este filtro na barra de filtros do Wireshark
Campo | Descrição | Exemplo |
---|---|---|
Cipher Suite | Algoritmo de criptografia escolhido | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 |
Named Curve | Curva elíptica utilizada | secp256r1 (P-256) |
Public Key Length | Tamanho da chave pública | 65 bytes (para P-256) |
Alice calcula: A = g^a mod p = 5^6 mod 23 = 8 Bob calcula: B = g^b mod p = 5^15 mod 23 = 19
Alice calcula: s = B^a mod p = 19^6 mod 23 = 2 Bob calcula: s = A^b mod p = 8^15 mod 23 = 2 Segredo compartilhado: 2
Aspecto | ECDHE (Produção) | DH (Demonstração) |
---|---|---|
Tamanho da chave | 256-384 bits | 23 (5 bits) |
Segurança | Muito alta | Nenhuma |
Tempo para quebrar | Impossível atualmente | Segundos |
Perfect Forward Secrecy | Sim | Sim (conceito) |
# Verificar certificado SSL de um site openssl s_client -connect google.com:443 -servername google.com # Listar cipher suites suportados nmap --script ssl-enum-ciphers -p 443 google.com # Verificar curvas elípticas suportadas openssl s_client -connect google.com:443 -curves secp256r1
Certificados X.509 garantem identidade e segurança, conforme MP 2.200-2/2001.
# Gerar chave privada
openssl genpkey -algorithm RSA -out user_priv.pem -pkeyopt rsa_keygen_bits:2048
# Criar CSR (Certificate Signing Request)
openssl req -new -key user_priv.pem -out user.csr \
-subj "/C=BR/ST=PR/L=Palotina/O=UFPR/OU=TI/CN=usuario.ufpr"
# Autoassinar CSR (vencimento: 365 dias)
openssl x509 -req -in user.csr -signkey user_priv.pem \
-out user_cert.pem -days 365
# Ver detalhes do certificado
openssl x509 -in user_cert.pem -noout -text
# Verificar fingerprint SHA256
openssl x509 -in user_cert.pem -noout -fingerprint -sha256
# Conectar e inspecionar cert de um site
openssl s_client -connect example.com:443 -showcerts
certbot certonly --standalone -d exemplo.com
. certbot.eff.orgAutenticação SSH com chaves elimina senhas, aumentando segurança.
# RSA 4096 bits
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -C "seu.email@ufpr.br"
# Ed25519 (recomendada)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "seu.email@ufpr.br"
# Copiar automaticamente
ssh-copy-id -i ~/.ssh/id_rsa.pub usuario@servidor
# Copiar manualmente
cat ~/.ssh/id_ed25519.pub | ssh usuario@servidor "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# Permissões corretas
ssh usuario@servidor "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
# Configurar servidor
ssh usuario@servidor "echo 'PubkeyAuthentication yes' >> /etc/ssh/sshd_config && sudo systemctl restart sshd"
# Testar
ssh usuario@servidor
# Conectar definindo a chave
ssh -i ~/.ssh/id_ed25519 usuario@servidor
Notícia prática: grandes data centers (Google, GitHub) migraram para Ed25519 em 2020 por performance³.
O YubiKey é um dispositivo de autenticação física desenvolvido pela Yubico que funciona como uma chave de segurança para proteger contas, sistemas e serviços contra acesso não autorizado. Ele é usado para: Autenticação de dois fatores (2FA); Login sem senha (SSH, GPG, etc.); ou Armazenamento seguro de chaves criptográficas.
yubico-piv-tool -a generate -s 9a
. yubico.comeval $(ssh-agent); ssh-add ~/.ssh/id_ed25519
.Prática: Configure SSH com chaves Ed25519 entre duas VMs, usando troca manual e ssh-copy-id. Integre uma chave com YubiKey e teste autenticação.
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 -C "seu_email@exemplo.com"
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@vm_remota
sudo apt install yubikey-manager scdaemon
ssh-keygen -t ed25519-sk -C "yubikey_chave"
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub usuario@vm_remota
ssh -i ~/.ssh/id_ed25519 usuario@vm_remota
# Para YubiKey:
ssh -i ~/.ssh/id_ed25519_sk usuario@vm_remota
PasswordAuthentication no
chmod 600 ~/.ssh/id_*
GPG protege e-mails e arquivos com criptografia e assinaturas.
# Instalar (Debian/Ubuntu)
sudo apt install gnupg
# Gerar chave GPG
gpg --full-generate-key
# Exportar pública
gpg --armor --export seu.email@ufpr.br > pubkey.asc
# Importar
gpg --import pubkey.asc
# Criptografar arquivo
gpg --encrypt --recipient seu.email@ufpr.br mensagem.txt
# Assinar arquivo
gpg --sign mensagem.txt
# Verificar assinatura
gpg --verify mensagem.txt.gpg
Aplicação real: PGP/GPG ainda usado em e-mail corporativo e em repositórios de código (ex.: Git tag signing).
Nota: O vazamentosde dados:
Prática: Configure Thunderbird com Enigmail para enviar e-mails criptografados. Troque chaves GPG entre alunos e verifique assinaturas.
sudo apt install thunderbird
(Linux) ou baixe em thunderbird.netsudo apt install gnupg
gpg --export -a "seu@email.com" > minha_chave_publica.asc
gpg --import chave_colega.asc
gpg --verify arquivo_assinado.asc
openssl genpkey -algorithm RSA -out rsa_priv.pem -pkeyopt rsa_keygen_bits:4096
gera um par RSA-4096.
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096
.
prime256v1
(também conhecida como secp256r1) foi utilizada.
prime256v1
, não secp384r1, secp521r1 ou secp256k1.
secret1.bin
e secret2.bin
?secret1.bin
e secret2.bin
são idênticos.
Issuer
mostra a Autoridade Certificadora que emitiu o certificado.
Issuer
identifica quem emitiu, não o Subject
ou Validity
.
openssl req -new -key user_priv.pem -out user.csr
gera o CSR.
openssl req -new -key ...
, não com x509 nem genpkey.
openssl s_client -connect example.com:443 -showcerts
mostra o certificado remoto.
s_client
, não verify ou x509 diretamente.
ssh-copy-id
faz a cópia e configurações necessárias no servidor.
ssh-copy-id
, não scp direto ou ssh-add.
gpg --encrypt --recipient
criptografa o arquivo para o destinatário.
--encrypt
, não --sign
ou --export
.