팀에서 임의 토큰을 생성하는 일부 서버 측 코드 (자바)를 넘겨주었습니다.
이 토큰의 목적은 상당히 민감합니다. 세션 ID, 비밀번호 재설정 링크 등에 사용됩니다. 따라서 누군가 추측하거나 피할 수없는 무력을 피하기 위해 암호화 적으로 임의적이어야합니다. 토큰은 "길이"이므로 64 비트입니다.
코드는 현재 java.util.Random
클래스를 사용하여 이러한 토큰을 생성합니다. 문서 에 대한 java.util.Random
명확는 다음을 주장한다 :
java.util.Random의 인스턴스는 암호화 적으로 안전하지 않습니다. 보안에 민감한 응용 프로그램에서 사용할 수 있도록 암호로 안전한 의사 난수 생성기를 얻으려면 SecureRandom을 사용하는 것이 좋습니다.
그러나 코드가 현재 사용하는 방식은 다음과 같습니다 java.util.Random
. java.security.SecureRandom
클래스를 인스턴스화 한 다음 SecureRandom.nextLong()
메소드를 사용하여 java.util.Random
클래스 를 인스턴스화하는 데 사용되는 시드를 가져옵니다 . 그런 다음 java.util.Random.nextLong()
메소드를 사용하여 토큰을 생성합니다.
그래서 내 질문은 지금- java.util.Random
를 사용하여 시드되고 있다는 점에서 여전히 안전하지 java.security.SecureRandom
않습니까? java.security.SecureRandom
토큰을 생성하는 데 독점적으로 사용하도록 코드를 수정해야 합니까?
현재 코드 시드는 Random
시작시 한 번입니다.
Random
는 시작할 때 한 번만 시드합니까 , 아니면 모든 토큰에 대해 새로운 시드를 줍니까? 잘만되면, 이것은 멍청한 질문이지만, 내가 확인할 것이라고 생각했습니다.
long
또는 double
값.