SecureRandom 스레드는 안전합니까?


103

SecureRandom스레드 안전은? 즉, 초기화 후 다음 난수에 대한 액세스가 스레드 안전을 위해 신뢰할 수 있습니까? 소스 코드를 살펴보면 이것이 사실임을 알 수 있으며, 이 버그 보고서 는 스레드로부터 안전한 문서가 부족하다는 것이 javadoc 문제임을 나타내는 것 같습니다. 실제로 스레드로부터 안전하다는 것을 확인한 사람이 있습니까?

답변:


108

네, 그렇습니다. 그것은 Random항상 사실상의 스레드 세이프 구현을 가지고있는을 확장 하고, 자바 7에서 명시 적으로 스레드 안전성을 보장합니다.

많은 스레드가 단일을 사용하는 경우 SecureRandom성능을 저하시키는 경합이있을 수 있습니다. 반면에 SecureRandom인스턴스 초기화는 상대적으로 느릴 수 있습니다. 전역 RNG를 공유하는 것이 가장 좋은지 각 스레드에 대해 새 RNG를 만드는 것이 가장 좋은지 여부는 응용 프로그램에 따라 다릅니다. ThreadLocalRandom클래스를 지원하는 솔루션을 제공하는 패턴으로 사용될 수있다 SecureRandom.


3
업데이트 해주셔서 감사합니다. 이상하게도이 버그는 "수정되지 않음"으로 종결 된 것으로 표시됩니다. 그러나 그들은 어쨌든 그것을 고쳤습니다. 오 글쎄, 나는 그들이 버그 데이터베이스의 크기를 부러워하지 않습니다.
Yishai 2011 년

4
초기화하는 것은이 SecureRandom뿐만 아니라 수 느릴 수 있지만, 잠재적으로가 없기 때문에 엔트로피의 걸 수
월터 Tross

8
ThreadLocalRandom은 크래킹하기가 매우 쉽기 때문에 생성 된 값을 세상에 노출 시키려면 SecureRandom을 대신 사용하십시오. jazzy.id.au/default/2010/09/20/…
walv

2
나는 여기 팔다리로 나가서이 대답이 틀렸다고 말할 것입니다. 스레드 안전성을 보장하는 Random에 대한 계약은 하위 클래스에 바인딩되지 않습니다. 확실히 문서화 된 Random의 다른 모든 속성은 하위 클래스에 바인딩되지 않으므로 스레드 안전성을 가정해야하는 이유를 알 수 없습니다.
대통령 제임스 K. 포크

2
@JamesKPolk 상위 유형의 속성을 보존하지 않으면 대체 가능성 원칙에 위배됩니다.
erickson

11

현재 구현 SecureRandom스레드 안전, 특히 두 돌연변이 방법이다 nextBytes(bytes[])setSeed(byte[])동기화된다.

글쎄, 내가 말할 수있는 한, 모든 mutating 메서드는 결국이 두 메서드를 통해 라우팅 SecureRandom되고 Random이를 보장하기 위해 몇 가지 메서드를 재정의 합니다. 어느 것이 작동하지만 향후 구현이 변경되면 깨질 수 있습니다.

가장 좋은 해결책은 SecureRandom먼저 인스턴스 에서 수동으로 동기화하는 것 입니다. 즉, 각 호출 스택이 동일한 객체에 대해 두 개의 잠금을 획득하지만 일반적으로 최신 JVM에서는 매우 저렴합니다. 즉, 자신을 명시 적으로 동기화하는 데 큰 해가되지 않습니다. 예를 들면 :

    SecureRandom rnd = ...;

    byte[] b = new byte[NRANDOM_BYTES];
    synchronized (rnd) {
        rnd.nextBytes(b);
    }

3
적어도 JDK 10에서 SecureRandom은 공급자를 기반으로하며 공급자가 스레드로부터 안전한지 확인하고 그렇지 않은 경우에만 동기화합니다. nextBytes.
nafg

java.security.SecureRandom#nextBytesJava 8에서는 동기화되지 않습니다. 동기화 된 Java 버전을 지정해 주 #nextBytes시겠습니까?.
Jaime Hablutzel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.