Os programadores da Web devem saber que nunca devem tentar implementar eles mesmos criptografia.
Em particular, isso significa que nenhum especialista em não segurança deve tocar diretamente em nenhuma das primitivas criptográficas. Eles não deveriam estar pensando no nível do AES, SHA-1, etc. Em vez disso, deveriam estar usando funções de alto nível para criptografar e assinar mensagens, além de senhas "hash".
Por quê? Porque, caso contrário, as pessoas se enganam ao pensar que:
- O AES-256 é "ótima criptografia", apesar de estarem usando-o no modo BCE, ou usando valores IV não aleatórios etc. (Em alguns modos, IVs não aleatórios, mas únicos, são aceitáveis. muito.)
- Eles podem usar a mesma chave simétrica para criptografar várias mensagens (ou pior, armazenar a chave simétrica no código para uso direto).
- Eles podem até decidir usar uma senha como chave diretamente, sem usar nenhuma função de derivação de chave.
- Eles podem usar o RSA para criptografar dados diretamente.
- Eles podem simplesmente "saltar e MD5" suas senhas para mantê-las seguras. (Se você acha que as tabelas do arco-íris são o elo mais fraco, pense novamente .)
Apenas para estar na mesma página, nenhum dos itens acima está correto . Se você não conseguir isso, não deve tocar na criptografia com uma vara de 3 metros! (O AES-256 é uma ótima criptografia, mas somente se você o usar corretamente. "Não é o tamanho que importa, é o que você faz com ele." :-))
De que tipo de funções de alto nível estou falando? Eu, pessoalmente, recomendo o uso de uma biblioteca OpenPGP (para dados em repouso) ou SSL (para dados em movimento). Esses protocolos especificam rigidamente o uso correto de algoritmos assimétricos, simétricos e de hash. Por exemplo, com o OpenPGP:
- Ele não usa o RSA para criptografar dados diretamente, mas gera uma chave de sessão aleatória (simétrica) por mensagem (isso é importante) e usa o RSA para criptografar essa chave de sessão.
- Ele usa uma função de derivação de chave para transformar senhas em chaves. (No jargão do OpenPGP, é chamado de S2K, mas acho que "função de derivação de chave" é o termo mais padrão.)
- Ele lida com a escolha de um bom modo, para que você nunca use o BCE.
- Ele lida com o gerenciamento de chaves para você, para que você não precise tomar decisões ad-hoc sobre quais chaves são confiáveis etc.
Resumo: se você não é um especialista em segurança e pensa no nível da AES, SHA-1 ou MD5, não está conseguindo , você está fazendo errado . Use uma biblioteca criada por especialistas em segurança (como o Bouncy Castle), que implementa protocolos projetados por especialistas em segurança (como o OpenPGP para criptografia ou bcrypt ou scrypt para hash de senha), em vez de usar o seu.
Eu não sou um especialista em criptografia de forma alguma, mas sei o suficiente para não tentar criar meus próprios protocolos ad-hoc. Só para esclarecer, todo este post é material da Cryptography 101 . Portanto, se este post não fizer 100% de sentido para você, você definitivamente não deve chegar nem perto da criptografia.