criptografia - perfect forward secrecy, o que é? - Stack Overflow em Português
editada 15/02/15 às 20:29
Em uma comunicação encriptada (por exemplo, via HTTPS) o cliente e o servidor compartilham um segredo - chamado "chave de sessão" - que é responsável por garantir a confidencialidade da comunicação. Qualquer um que intercepte essa comunicação, mas não conheça esse segredo, não consegue decifrar os dados interceptados. Ele pode guardar esses dados pro futuro, entretanto, na esperança que um dia ele consiga interpretá-los (seja via criptanálise, ou através de outros meios).
A maneira como essa chave de sessão é criada tem um impacto na viabilidade desses "outros meios". Digamos que uma chave mestra (por exemplo, a chave privada do certificado do servidor) seja usada para derivar as chaves de sessão, cada vez que um cliente conecta. Cada sessão tem sua chave, mas todas vieram dessa chave mestra. Num determinado ponto futuro, o atacante consegue invadir o servidor e recuperar a chave mestra. Aí é só ele repetir o processo de derivação que originou as chaves de sessão, e usar os resultados para decifrar os dados que ele guardou.
Por outro lado, se as chaves de sessão não são diretamente derivadas de nada - são criadas por processos aleatórios, que não podem ser refeitos no futuro - aí não adianta nada o atacante invadir o servidor, roubar todos os seus segredos, etc: as comunicações passadas entre ele e os clientes continuam confidenciais (desde que não armazenadas no servidor, é claro), pois as chaves de sessão já foram jogadas fora e não existe um meio de recriá-las.
Perfect Forward Secrecy (Segurança Futura/"Pra Frente" Perfeita) é essa propriedade, em que uma comunicação presente é confidencial, e espera-se que ela se mantenha confidencial no futuro mesmo que as chaves permanentes de um ou de outro (o certificado do servidor, o certificado ou usuário/senha do cliente) sejam comprometidas. Alternativamente, se uma única comunicação for comprometida (digamos que a chave de sessão "vazou") isso não compromete a confidencialidade de todas as comunicações anteriores a ela.
É difícil dar um exemplo com confiança, pois não tenho conhecimento suficiente de protocolos criptográficos, então vou reproduzir aqui o exemplo gráfico do artigo sofre Diffie-Hellman na Wikipedia. Note que o protocolo real é um pouquinho mais complicado que isso (pois o DH original não assegurava a autenticidade da comunicação, e portanto era vulnerável a ataques Man-in-the Middle).
Digamos que Alice e Bob querem se comunicar um com o outro, e ambos combinam em um parâmetro comum (a "tinta amarela"). Cada um deles escolhe aleatoriamente um outro segredo/chave (as "tintas vermelha e azul") e combina-o com o parâmetro comum de uma forma irreversível (a "primeira mistura das tintas"). Cada um envia ao outro o resultado dessa operação, que por sua vez é combinado com o seu próprio segredo (a "segunda mistura das tintas") de modo a produzir um segredo comum (a "tinta marrom"). Esse segredo comum pode então ser usado como chave de criptografia, para garantir a confidencialidade das mensagens trocadas até o final daquela sessão. No final da sessão, todos os segredos envolvidos são jogados fora (esse é o ponto chave da PFS).
Alguém que esteja "escutando" a comunicação sabe qual é o parâmetro comum, e os resultados intermediários de cada computação, mas somente com base nisso não consegue descobrir nem os segredos individuais de Alice e Bob nem o segredo final que é compartilhado entre ambos. E como todos os segredos foram descartados, ainda que todos os dados encriptados sejam armazenados pelo atacante, não há esperança dele recuperar esses segredos no futuro, de modo que a comunicação efetuada pode ser considerada "perfeitamente segura pra sempre".
(Isto é: até que o próprio algoritmo criptográfico seja quebrado - permitindo decifrar as mensagens sem precisar das chaves - ou a velocidade dos computadores cresça tanto a ponto de viabilizar uma quebra por força bruta... Entretanto, essa é considerada a hipótese menos provável, desde que um bom algoritmo criptográfico tenha sido usado.)
respondida 15/02/15 às 21:23
Nossa, você explica bem! eu não sabia que existia uma primeira fórmula para D-H que era falha.. entendi perfeitamente o que me propôs, gostaria de confirmar. Suponhamos que A e B estabeleceram conexão e trocaram chaves através do DH e cada mensagem que um manda para o outro é encriptada usando a chave D-H + um parâmetro aleatório que será passado pela rede para poder decriptar a mensagem fazendo a derivação junto a chave D-H, podemos dizer que o PFS foi estabelecido neste? – Gabriel Henrique 15/02/15 às 21:57
@GabrielHenrique O ponto chave é usar chaves "descartáveis" - nem todo DH provê PFS, apenas as implementações que geram a chave na hora e depois descartam (chamado de "Diffie-Hellman Efêmero" - EDH ou DHE, dependendo da suite). – mgibsonbr 15/02/15 às 22:03
Chaves descartáveis, ou seja chaves únicas para cada mensagem correto? – Gabriel Henrique 15/02/15 às 22:05
Não necessariamente únicas por mensagem, mas únicas por sessão. Claro, todas as mensagens da sessão formam um único conjunto, com o mesmo nível de proteção, mas cada conjunto está isolado de todos os outros (o comprometimento de um não compromete os outros). – mgibsonbr 16/02/15 às 1:21