Różnica między java.util.Random i java.security.SecureRandom
Mój zespół przekazał kod po stronie serwera (w Javie), który generuje losowe tokeny i mam pytanie dotyczące tego samego -
Cel tych tokenów jest dość wrażliwy - używany do identyfikatora sesji, linków do resetowania hasła itp. Dlatego muszą być kryptograficznie losowe, aby uniknąć zgadywania ich lub brutalnego wymuszania. Token jest „długi”, więc ma 64 bity długości.
Kod obecnie używajava.util.Random
klasa, aby wygenerować te żetony. Dokumentacja ([http://docs.oracle.com/javase/7/docs/api/java/util/Random.html][1]) dlajava.util.Random
wyraźnie stwierdza, co następuje:
Instancje java.util.Random nie są zabezpieczone kryptograficznie. Rozważ zamiast tego użycie SecureRandom do uzyskania kryptograficznie bezpiecznego generatora liczb pseudolosowych do użytku przez aplikacje wrażliwe na bezpieczeństwo.
Jednak sposób, w jaki kod jest obecnie używanyjava.util.Random
jest to - tworzy instancjęjava.security.SecureRandom
klasa, a następnie używaSecureRandom.nextLong()
metoda uzyskiwania materiału siewnego używanego do tworzenia instancjijava.util.Random
klasa. Potem używajava.util.Random.nextLong()
metoda generowania tokena.
Więc moje pytanie teraz - czy nadal jest niepewne, biorąc pod uwagę, żejava.util.Random
jest wysiewany za pomocąjava.security.SecureRandom
? Czy muszę zmodyfikować kod, aby go używałjava.security.SecureRandom
wyłącznie do generowania żetonów?
Obecnie seed kodu jestRandom
raz przy starcie