SecureRandom

SecureRandom (보안 난수 생성기)

암호학적으로 강력한 난수 생성기(RNG)를 제공하는 클래스입니다. 암호학적으로 강력한 난수는 최소한 FIPS 140-2의 통계적 난수 생성기 테스트를 충족하며, 비결정적 출력을 생성해야 합니다.

출처: Java API Reference

본문

SecureRandom은 보안에 사용하기에 적합한 암호학적으로 강력한 난수 생성기입니다. SecureRandom에 전달되는 시드(seed) 자료는 예측 불가능해야 하며, 모든 출력 시퀀스는 RFC 4086에서 설명하는 것처럼 암호학적으로 강력해야 합니다.

많은 SecureRandom 구현은 PRNG(의사 난수 생성기, 일명 DRBG) 형태로, 결정적 알고리즘으로 난수 시드로부터 의사 난수 시퀀스를 생성합니다. 일부 구현은 진정한 난수를 생성하고, 또 다른 구현은 두 기법을 결합합니다.

호출자는 무인자 생성자나 getInstance 메서드로 SecureRandom 인스턴스를 얻습니다.

SecureRandom r1 = new SecureRandom();
SecureRandom r2 = SecureRandom.getInstance("NativePRNG");
SecureRandom r3 = SecureRandom.getInstance("DRBG", DrbgParameters.instantiation(128, RESEED_ONLY, null));

일반적인 사용법은 nextBytes로 임의 바이트를 얻고, generateSeed로 다른 난수 생성기를 시드하기 위한 시드 바이트를 얻는 것입니다.

SecureRandom random = new SecureRandom();
byte[] bytes = new byte[20];
random.nextBytes(bytes);
byte[] seed = random.generateSeed(20);

새로 생성된 PRNG SecureRandom 객체는 시드되지 않은 상태입니다(시드된 상태로 생성된 경우 제외). 첫 nextBytes 호출이 구현 특유의 엔트로피 소스로부터 스스로 시드하도록 만듭니다. 이 자체 시딩은 이전에 setSeed가 호출된 경우 발생하지 않습니다. reseedsetSeed 메서드로 언제든 다시 시드할 수 있는데, reseed는 엔트로피 소스에서 읽고 setSeed는 호출자가 시드를 제공합니다. 일부 구현은 reseed를 지원하지 않을 수 있습니다.

구현에 따라 generateSeed, reseed, nextBytes는 엔트로피 수집 중(예: /dev/random 사용 시) 블록될 수 있습니다. SecureRandom 객체는 여러 동시 스레드가 안전하게 사용할 수 있습니다.

SecureRandom의 주요 메서드는 다음과 같습니다.

  • public static SecureRandom getInstance(String algorithm) — 지정된 RNG 알고리즘을 구현하는 SecureRandom 객체를 반환합니다.
  • public static SecureRandom getInstance(String algorithm, SecureRandomParameters params) — 지정된 알고리즘과 SecureRandomParameters 요청을 지원하는 객체를 반환합니다.
  • public final Provider getProvider() — 이 객체의 프로바이더를 반환합니다.
  • public String getAlgorithm() — 이 객체가 구현하는 알고리즘 이름을 반환합니다.
  • public SecureRandomParameters getParameters() — 이 인스턴스의 유효 매개변수를 반환합니다.
  • public void setSeed(byte[] seed) — 주어진 시드로 이 난수 객체를 다시 시드합니다. 기존 시드를 대체하지 않고 보완합니다.
  • public void setSeed(long seed) — 주어진 long 시드의 8바이트로 다시 시드합니다. java.util.Random과의 호환을 위해 정의되었습니다.
  • public void nextBytes(byte[] bytes) — 사용자가 지정한 수의 임의 바이트를 생성합니다.
  • public void nextBytes(byte[] bytes, SecureRandomParameters params) — 추가 매개변수로 임의 바이트를 생성합니다.

더 알아보기 (Learn more)

Java 공식 API