java Random 과 SecureRandom

greenTea·2024년 1월 2일
0

🎲 Java의 Random 클래스: 의사 난수 생성기

Java에서 Random 클래스를 사용하면 동일한 시드(seed) 값으로 여러 번 초기화할 때 매번 같은 순서의 난수를 생성합니다. 코드로 확인해보겠습니다.

🧩 Random 테스트 코드 예시 (Kotlin)

@Test
fun test2() {
    for (i in 1..3) {
        val random = Random(10)
        println(random.nextDouble())
    }
}

이 코드를 실행하면 다음과 같은 결과를 얻습니다:

🤔 결과 분석: 왜 항상 같은 값이 나올까?

  1. Random 생성자 분석:


    Random 객체는 주어진 초기 시드 값에 initialScramble(seed)를 적용하여 내부 상태를 초기화합니다. 이 초기 상태는 난수 생성 과정에 영향을 미칩니다.

  1. next() 메소드 동작 원리:
    • nextseed = (oldseed * multiplier + addend) & mask: 새로운 시드 값을 계산합니다. 고정된 multiplier, addend, mask 값을 사용하여 현재 시드 값을 변형시킵니다.
    • seed.compareAndSet(oldseed, nextseed): 멀티스레드 환경에서도 시드 값이 안정적으로 업데이트되도록 합니다.
      - (int)(nextseed >>> (48 - bits)): 계산된 값을 이용하여 난수를 추출합니다.

💡 시드 값이 지정되지 않은 경우

Random 생성자에 시드 값을 지정하지 않으면, 현재 시간(System.nanoTime())을 시드 값으로 사용합니다.

난수 추출 과정인 (int)(nextseed >>> (48 - bits))를 통해 Random하게 값을 추출하는 것이 아니고 일정한 알고리즘을 통해 예측하기 어려운 숫자를 만드는 것을 알 수 있습니다.

이는 Random 클래스가 의사 난수 생성기라는 특성 때문입니다. 의사 난수 생성기는 특정한 알고리즘을 사용하여 수열을 생성하며, 동일한 시드 값으로 초기화되면 항상 동일한 난수 수열을 생성합니다.

알겠습니다! 아래는 제공하신 정보를 기반으로 개선한 내용입니다. 이모지도 포함했습니다.


🌟 SecureRandom: 안전한 난수 생성기

SecureRandom 클래스는 기존 Random 클래스의 보안 취약점을 보완하기 위해 등장했습니다. SecureRandom은 암호학적으로 강력한 난수를 생성하는 데 사용되며, 보안이 중요한 애플리케이션에서 필수적입니다.

🛠 사용 방법 (kotlin)

SecureRandom 클래스의 사용 방법은 다음과 같습니다:

@Test
fun sTest1() {
    for (i in 1..3) {
        val sRandom = SecureRandom.getInstanceStrong()
        println(sRandom.nextDouble())
    }
}
  • SecureRandom.getInstanceStrong(): 강력한 알고리즘을 사용하는 SecureRandom 인스턴스를 생성합니다.
  • nextDouble(): 난수를 생성합니다. 이 메서드는 Random 클래스와 유사하게 사용할 수 있습니다.

🎲 결과 비교

SecureRandom을 사용할 때의 결과는 Random과 달리 매번 진정으로 무작위적인 값을 생성합니다. 이는 SecureRandom이 보다 복잡한 방식으로 시드를 생성하고 다양한 알고리즘을 사용하기 때문입니다.

(실제 코드를 보면 Random과는 다르게 seed 설정에 있어 복잡한 과정을 지니고 있는 것을 확인 할 수 있습니다.)

마무리

SecureRandom 클래스를 통해 보안이 중요한 상황에서 안전하고 무작위적인 난수를 생성할 수 있습니다. 🛡

참고자료 : [Java] Random보단 SecureRandom 를 사용하자

profile
greenTea입니다.

0개의 댓글