2014-10-23 4 views
0

는 I는 각각의 토큰 실제로 액세스로 사용됩니다 암호화 보안, 임의독특한 문자열을 생성해야합니다. 이를 위해 Java의 SecureRandom 클래스를 사용할 계획입니다. 그러나 SecureRandom이 유일성을 보장하는지 확신 할 수 없습니다. 다시 말해, SecureRandom은 생성 될 때마다 다른 값을 생성합니까?SecureRandom은 매회 다른 값을 보증합니까?

seed 값 (즉, new SecureRandom(byte[] seed))으로 인스턴스를 만드는 것이 효과가 있습니다. 그러나, 나는 그것의 확실하지 않다. 더욱이이 answer은 시드가 안전하거나 이식성이 없다고 말합니다. 씨앗 값 서버가 내 목적인가?

SecureRandom 이외의 제안 사항이 있으면 알려주십시오.

+2

random의 정의에 따르면 연속적으로 생성 된 두 개의 문자열이 고유하다는 것만으로는 알 수 없습니다. 두 문자열이 같은지 여부를 수동으로 확인해야합니다. –

+0

이런 종류의 질문은 종종 극단을 취함으로써 대답 될 수 있습니다. 단 하나의 무작위 비트를 가져 가면 고유할까요? 글쎄, 처음에는 50 %의 확률로 세 번째로 (우리가 이미 실패하지 않았다면) 두 번째로, 그러면 확실히 운이 나지 않을 것입니다. –

답변

8

아니요, SecureRandom 인스턴스는 이 아니며은 고유 한 결과를 보장합니다. 그것이 보장된다면, 당신은 이미받은 결과를 얻을 수 없다는 것을 알게 될 것이므로 완전히 무작위 적이지는 않을 것입니다.

시드 값을 설정해도이 상황이 개선되지 않습니다. 또한 전달하는 시드가 SecureRandom 구현에 의해 내부적으로 생성 된 시드를 추가 (보충)하기 때문에 상황을 악화시키지 않습니다.

고유 한 난수를 보장하려면 이전에 생성 된 모든 숫자를 유지 한 다음 이미 반환 된 새 숫자를 생성 할 때를 확인해야합니다. 그럴 경우 새 번호를 생성해야합니다 (그리고 수표를 반복하십시오).

그러나 생성하는 숫자가 상당히 큰 경우 고유하지 않은 숫자가 생성 될 확률은 무시할 정도로 작습니다. 256 비트 또는 그 이상 (32 바이트)의 수를 생성 해보십시오. 이것은 UUID가 "고유 한"숫자를 생성하는 데 사용하는 메커니즘이기도합니다. 이것들은 또한 유일무이 함을 보장하지 않지만 복제물을 얻기 전에 매우 오랜 시간 (평균적으로) 기다려야 할 것입니다.

+0

IIRC, 다음 중 하나입니다. WW2 독일어 수수께끼 시스템의 암호 학적 약점은 핵심 가치 *가 서로 달라야한다고 주장했기 때문입니다. – Raedwald

+2

별개의 임의 값은 [고유 한 임의 문자열 목록 생성 방법] (http://crypto.stackexchange.com/questions/1379/how-to-generate-a-list-of-unique-random-strings)을 참조하십시오.). – rossum

관련 문제