난수는 무작위성, 예측 불가능성, 재현 불가능성 성질이 있다.
무작위성이란 수열의 비트 분포가 균등하고 0과 1이 등장하는 빈도가 비슷한 것을 의미한다.
예측 불가능성이란 수열의 일부를 보고 다음 비트를 예상할 수 없어야 함을 의미한다.
재현 불가능성이란 같은 수열을 똑같이 재현할 수 없다는 성질이다. 이는 하드웨어도 동원되어야 한다.
무작위성만 가지는 난수를 약한 의사 난수, 예측 불가능성을 가지는 난수를 강한 의사 난수, 재현 불가능성을 가지는 난수를 진성 난수라고 한다.
진성 난수란 자연적이고 예측 불가능한 물리적 현상(엔트로피 소스)에서 생성된 난수로 완전히 랜덤하고 재현이 불가능하다.
하드웨어 난수 생성기(HRNG; Hardware Random Number Generator)와 같이 물리적 장치를 사용해 난수를 생성한다.
의사난수란 알고리즘에 의해 생성된 난수로 난수처럼보이지만
알고리즘의 상태에 의해 값이 정해지므로 생성된 수열은 일정한 주기를 가지며, 따라서 난수의 예측 불가능성을 가질 수 없다.
동일한 Seed를 알면 예측이 가능하다. Seed는 난수 또는 의사난수어야 한다.
의사난수 생성기(PRNG; Rseudorandom Number Generator)를 통해 생성한다.
출처 :
http://www.parkjonghyuk.net/lecture/2021-1st-lecture/information-protect/chap13.pdf
https://velog.io/@cjy/%EB%82%9C%EC%88%98
네트워크보안 에센셜
유사난수 : 일반적인 프로모션 쿠폰, 대량 배포가 필요한 상황에서 사용하며 빠르고 효율적으로 코드를 생성할 수 있다.
진성난수 : 고가 상품, VIP 대상 쿠폰, 쿠폰 생성 알고리즘이 역공학될 위험을 최소화한다.
디폴트 시드값으로 시스템의 현재 시간을 활용한다.
스레드 안전하지만, 여러 스레드에서 동시에 Random 인스턴스를 사용하면 경합이 발생하여 성능이 저하될 수 있다.
멀티스레드 환경에서 ThreadLocalRandom을 사용하는 것을 고려해봐야 한다.암호학적으로 안전하지 않기에 보안에 민감한 애플리케이션에서 암호학적으로 안전한 SecureRandom을 사용하는 것을 고려해봐야 한다.
암호화적으로 강력한 난수 생성기 (RNG)을 제공한다.
통계적 난수 생성기 테스트를 준수한다.
즉, SecureRandom에 전달된 모든 시드 자료는 예측할 수 없어 하며 출력 시퀀스는 암호화적으로 강력해야 한다.
스레드에서 격리된 난수 생성기로 ThreadLocalRandom 내부적으로 생성된 시드로 초기화되며 다른 방법으로는 수정될 수 없다.
import java.util.concurrent.ThreadLocalRandom;
int randomNum = ThreadLocalRandom.current().nextInt(min, max + 1);
여러 작업(예: 각 a ForkJoinTask)이 스레드 풀에서 병렬로 난수를 사용하는 경우 를 사용하는 것이 특히 적합하다.
암호학적으로 안전하지 않다.
[인프런강의] 백엔드 애플리케이션 성능 테스트하기 (0) | 2025.01.08 |
---|---|
[스프링] Spring AOP 와 동작 원리 (0) | 2025.01.03 |
[테스트] nGrinder 활용한 성능 테스트하는 방법 (0) | 2024.12.22 |
[패키징및배포] Jar vs War (0) | 2024.12.21 |
[Spring] 템플릿 메서드 디자인 패턴, 템플릿 콜백 패턴 (4) | 2024.12.16 |