[Java] 인증번호 생성 방법
2023. 3. 28. 22:02ㆍProgramming Languages/Java
1. 문제
프로젝트에서 이메일 인증을 통해 회원가입을 수행하도록 하는 요구사항이 발생했다. 이때 6자리 숫자를 입력하는 방법으로 인증을 하도록 했는데 이 방법에 대해서 찾아본 내용들을 정리한다.
2. 인증번호 생성 방법
자바에서 인증번호를 생성하는 방법은 여러 가지가 존재한다.
Random
ThreadLocalRandom
SecureRandom
이 중에서 세 번째인 SecureRandom
을 사용하도록 한다.
3. Random 탈락 이유
Java에서는 난수를 제공하는 방법으로 Random
패키지를 제공한다. 하지만 암호학적으로 안전하지 않다. 이는 공식 문서에 언급되어 있다.
💡 Instances of `java.util.Random` are not cryptographically secure. Consider instead using `SecureRandom` to get a cryptographically secure pseudo-random number generator for use by security-sensitive applications.
4. ThreadLocalRandom
또 다른 방법으로는 ThreadLocalRandom
패키지를 사용할 수 있다. 이 패키지는 Random
의 쓰레드 경쟁 상태의 성능을 개선한 패키지다. 하지만 이 패키지 또한 암호학적으로 안전하지 않다고 공식 문서에 언급되어 있다.
💡 Instances of `ThreadLocalRandom` are not cryptographically secure. Consider instead using SecureRandom in security-sensitive applications. Additionally, default-constructed instances do not use a cryptographically random seed unless the `java.util.secureRandomSeed` is set to `true`.
다음은 성능을 비교한 글이다.
[Java] Random vs ThreadLocalRandom performance
5. SecureRandom
마지막으로 최종 선택한 SecureRandom
패키지다. 공식 문서 내용을 번역하면 다음과 같다.
💡 이 클래스는 암호화 모듈의 보안 필수 조건인 FIPS 140-2의 섹션 4.9.1에 지정된 통계적 난수 생성기 테스트를 최소한으로 준수한다. `SecureRandom`은 반드시 비결정적 출력을 생성해야 한다. 따라서 모든 시드 데이터는 예측할 수 없어야 하고 모든 출력 시퀀스는 RFC 4086에 따르는 강력한 암호화 방식이어야 한다.
많은 SecureRandom
구현체들은 의사 난수 생성기(PRNG)의 형태로 되어 있다. 즉, 결정론적 알고리즘을 사용하여 랜덤 시드에서 의사 랜덤 시퀀스를 생성한다. 또한 Thread-safe하므로 위 두 패키지보다 적합하다.
6. 결론
암호학적으로 비교적 안정적이고 Thread-safe한 SecureRandom
패키지를 사용하여 인증번호를 생성하도록 한다.
'Programming Languages > Java' 카테고리의 다른 글
[Java] Lombok 사용 시 주의사항 (0) | 2023.04.15 |
---|---|
[Java] ArrayList의 capacity, size, 그리고 add(int index, E element) (0) | 2023.03.16 |
[Java] VSCODE에서 MAVEN 프로젝트에 MySQL JDBC 연동 (1) | 2021.12.11 |
[Java] 메서드 시그니처 (0) | 2021.12.04 |
[Java] Equals and HashCode (0) | 2021.10.19 |