Diferença entre java.util.Random e java.security.SecureRandom
Minha equipe foi entregue algum código do lado do servidor (em Java) que gera tokens aleatórios e eu tenho uma pergunta sobre o mesmo -
O objetivo desses tokens é bastante sensível - usado para id de sessão, links de redefinição de senha, etc. Portanto, eles precisam ser criptograficamente aleatórios para evitar que alguém os adivinhe ou forçá-los a aplicá-los de forma mais brutal. O token é "longo", então tem 64 bits.
O código atualmente usa ojava.util.Random
classe para gerar esses tokens. A documentação ([http://docs.oracle.com/javase/7/docs/api/java/util/Random.html][1]) parajava.util.Random
afirma claramente o seguinte:
Instâncias de java.util.Random não são criptograficamente seguras. Considere, em vez disso, usar SecureRandom para obter um gerador de números pseudo-aleatórios criptograficamente seguro para uso por aplicativos sensíveis à segurança.
No entanto, a maneira como o código está usando atualmentejava.util.Random
é isso - instancia ojava.security.SecureRandom
classe e, em seguida, usa oSecureRandom.nextLong()
método para obter a semente que é usada para instanciar ojava.util.Random
classe. Então ele usajava.util.Random.nextLong()
método para gerar o token.
Então, a minha pergunta agora - Ainda é inseguro, dado que ojava.util.Random
está sendo semeado usandojava.security.SecureRandom
? Preciso modificar o código para que ele usejava.security.SecureRandom
exclusivamente para gerar os tokens?
Atualmente, o código seed é oRandom
uma vez na inicialização