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.Randomclasse. 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

questionAnswers(7)

yourAnswerToTheQuestion