프로젝트를 진행하던 중 흔히들 사용하는 랜덤 인증번호 생성 프로세스가 필요해 작성해보았다. 생성되는 인증번호는 영어 소문자와 숫자의 조합이다. (인증번호에 대소문자 구분하는 것 만큼 짜증나는 것이 없기에...)
코드
import java.security.SecureRandom;
/**
* 랜덤 인증번호 생성 클래스
*/
public class RandomAuthCode {
// 인증 코드에 사용될 문자들
private static final String CHARACTERS = "abcdefghijklmnopqrstuvwxyz0123456789";
// 인증 코드의 길이 (6자리)
private static final int CODE_LENGTH = 6;
// 보안 강화를 위한 SecureRandom 사용
private static final SecureRandom RANDOM = new SecureRandom();
/**
* 인증 코드를 생성하는 메소드
*
* @return 생성된 인증 코드 (Ex. wu2mf9)
*/
public static String generate() {
StringBuilder code = new StringBuilder(CODE_LENGTH);
// 지정된 길이만큼 랜덤 문자를 선택하여 인증 코드 생성
for (int i = 0; i < CODE_LENGTH; i++) {
// CHARACTERS에서 랜덤하게 문자를 선택하여 코드에 추가
code.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length())));
}
return code.toString(); // 생성된 인증 코드를 문자열로 반환
}
}
사용
@AllArgsConstructor
public class ExamService {
private final RandomAuthCode randomAuthCode;
public void example(){
String authCode = randomAuthCode.generate();
}
}
Random 클래스와 SecureRandom 클래스의 차이
Random
목적: 일반적인 용도의 난수 생성
사용 사례: 시뮬레이션, 게임, 비과학적 계산 등 보안이 중요하지 않은 경우
알고리즘: 선형 합동 생성기(Linear Congruential Generator, LCG) - 빠르고 메모리 효율적이지만, 예측 가능성이 높다
SecureRandom
목적: 보안이 중요한 용도의 난수 생성
사용 사례: 암호화 키, 보안 토큰, 패스워드 생성 등 보안이 중요한 경우
알고리즘: 암호화 강도(cryptographically strong) 난수 생성기 - 운영체제에 따라 다른 알고리즘을 사용할 수 있으며, 기본적으로 매우 예측하기 어렵도록 설계되어 있음