2012-03-10 4 views
1

내 안드로이드 클라이언트와 Server (Servlet)에서 난수를 얻고 있습니다. 클라이언트와 서버 모두에서 동일한 SecureRandom 알고리즘 ("SHA1PRNG")을 사용하고 있습니다. 내 시드 값은 둘 다 동일합니다. 하지만 출력 숫자는 클라이언트뿐만 아니라 서버에서도 다릅니다. 그 이유는 무엇일까요?SecureRandom number의 알고리즘

SecureRandom random = new SecureRandom(); 
try { 
    random.getInstance("SHA1PRNG"); 
} catch (Exception e) { 
    // ... 
} 
; 
random.setSeed(1097327); 
byte[] b1 = new byte[3]; 
random.nextBytes(b1); 
long value = 0; 
for (int i = 0; i < b1.length; i++) { 
    value += (b1[i] & 0xff) << (8 * i); 
    Toast.makeText(getApplicationContext(), Long.toString(value), 
      Toast.LENGTH_LONG).show(); 
} 

답변

2

의 SecureRandom의 javadoc는 말한다 :

많은 SecureRandom의 구현은 그들이 결정 를 사용 즉, 의사 랜덤 번호 생성기 (PRNG)의 형태로 여기에 내 코드입니다 알고리즘을 사용하여 진정한 랜덤 시드로부터 의사 랜덤 시퀀스를 생성합니다. 다른 구현은 진정한 난수를 생성 할 수 있고, 또 다른 것은두 기술의 조합을 사용할 수 있습니다.

아마도 알고리즘은 다른 임의성 소스를 사용하여 임의의 숫자를 생성합니다. 그렇게하면 (자), SecureRandom 클래스의 규약이 깨지지 않습니다. 보안 무작위 생성기의 목적은 숫자의 예측 가능한 순서가 아닌 난수를 생성하기 때문에 훨씬 더 만족 스러울 것입니다.

+0

Android에서 보안 랜덤 넘버 생성기를 사용하고 동일한 시드 인스턴스를 두 번 사용하면 같은 난수가 두 번 나타납니다. 서블릿에서 동일한 작업을 수행했을 때 두 개의 동일한 시드에 대해 두 개의 동일한 난수가 있습니다. 하지만 문제는 난수입니다 ** 안드로이드는 서블릿의 난수와 같지 않습니다 ** – suraj

+1

Android 플랫폼과 서블릿에서 사용되는 JDK의 구현은 약간 씩 다를 수 있습니다. 그러나 요점은 남아 있습니다 : 여러 플랫폼에서 숫자의 예측 가능한 순서를 얻기 위해, 계약에 의해 가능한 한 안전하게 무작위로 숫자를 생성해야하는 클래스를 사용하는 것은 좋은 생각이 아닙니다. 계약에 따라 시드를 사용하여 예측 가능한 시퀀스를 생성하거나 측면 중 하나에 숫자를 생성하고 다른 측면과 공유하는 자체 알고리즘을 사용해보십시오. –

+0

오케이. 나는 그것을 고려할 것이다. 고맙습니다. 너 정말 멋지다. – suraj

0

4 년 후에 2 센트를 투입하겠습니다.

SecureRandom은 실제로 시스템에 따라 다르며 데이터 생성 방법은 OS에 따라 다릅니다. OS 자체는 엔트로피를 얻기위한 인터페이스를 제공합니다 (마우스를 움직이는 방식 일 수도 있습니다). 그것이 다른 결과를 가져 오는 이유입니다.