De acordo com a conversa nos comentários, o que você quer dizer é hashing senhas, não criptografia senhas. Você normalmente faria isso com um sal para evitar um ataque de mesa de arco-íris. Armazenar senhas como hashes salgados é o padrão de melhor prática quando se trata de armazenar senhas em bancos de dados.
A partir da versão 3.2, o MongoDB não tem suporte nativo para hash de senha como alguns bancos de dados SQL fornecem, então você terá que implementá-lo em Java.
Para gerar uma nova conta ou alterar a senha de uma conta existente:
- gerar um valor salt aleatório criptograficamente seguro com
java.security.SecureRandom
. Essa classe funciona exatamente como o gerador de números aleatórios padrãojava.util.Random
(é uma subclasse), mas troca o desempenho por um nível muito mais alto de imprevisibilidade que é necessário para um contexto relevante para a segurança. - Crie uma string concatenando salt e senha
- Gere um hash dessa string com uma função de hash criptograficamente segura. Existem muitas funções de hash fornecidas pelo Java pronto para uso, mas você deseja usar uma que seja intencionalmente difícil de computar para desacelerar um invasor com acesso ao banco de dados tentando forçar seus hashes em seu cluster de supercomputador local. Um bom candidato é o algoritmo "PBKDF2WithHmacSHA1", que é suportado pelo
javax.crypto.SecretKeyFactory
aula. - Salve o documento no MongoDB com os campos
username
,password_hash
epassword_salt
(mais seus dados reais do aplicativo, é claro). Não salve a senha original.
Para recuperar uma conta:
- Leia o
username_input
epassword_input
o suposto usuário entrou em seu formulário de login. - Recupere o documento onde o
username
corresponde aousername_input
o usuário forneceu. - Obtenha o
password_salt
campo desse documento - Crie uma string concatenando
password_salt
epassword_input
assim como você fez antes. - Gere um hash dessa string com a mesma função de hash criptograficamente segura.
- Compare o hash com o
password_hash
campo do documento. Quando corresponde, o usuário digitou a senha correta.
Você poderia, alternativamente, recuperar apenas os campos password_hash e password_salt do documento e não carregar o restante antes que o usuário seja autenticado, mas eu diria que no mundo real isso causará mais carga do que salvaria. Os logins bem-sucedidos geralmente superam em muito os malsucedidos, a menos que você tenha um invasor que tente forçar uma conta à força bruta. E, nesse caso, você bloquearia o invasor com fail2ban ou outro mecanismo de limitação de login.