Languages/Java

[Java]SecureRandom 클래스를 이용한 임시 비밀번호 생성 방법

MoonSta 2023. 2. 3. 09:06

우리가 특정 웹사이트의 비밀번호를 잊어버렸을 경우 회원 정보 확인 후 로그인을 위한 임시 비밀번호를 제공받는다. 이러한 임시 비밀번호는 어떻게 생성이 되는 것일까? 바로 Java의 강력한 암호화 난수 생성기를 제공하는 SecureRandom 클래스를 사용하여 구현이 가능하다. 하지만 SecureRandom 클래스 외에 그냥 Random 클래스 또한 존재하지만 잘 사용하지 않는다. 이것의 이유 또한 알아보자.


Random VS SecureRandom

 우선 이 두 개의 클래스를 비교하기 위해서는 seed에 대한 개념을 알고 있어야 한다. seed는 난수를 발생시키는 기준 값을 의미한다. Random, SecureRandom의 가장 큰 차이는 이 seed의 값이 다르다. Random 클래스는 시스템 시간을 기준으로 하고 SecureRandom은 OS에 있는 임의의 데이터를 기준으로 한다. 그렇기 때문에 Random 클래스의 seed가 되는 시간이 동일하다면 결과적으로 동일한 난수를 생성할 것이다. 이것은 보안적인 요소에서 치명적이기 때문에 Random 클래스의 사용을 지양해야 한다. 

 

 


 

SecureRandom이 일반 Random 보다 더 나은 점

 

1. 난수를 발생시키는 기준인 seed의 값이 시간이 아니기 때문에 보안적인 요소에서 더 뛰어남 

2. Random 클래스는 48 bit인 반면 SecureRandom 클래스는 128 bit 이기 때문에 반복될 가능성이 적음

3. SecureRandom 클래스는 결정론적 알고리즘이 도입되었기 때문에 예측 가능성이 낮은 의사 난수 값 생성

 

 

 

SecureRandom을 사용한 임시 비밀번호 생성 구현

public String makeRandomPw(int len) {
    
    //소문자, 대문자, 숫자 
    final String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    
    SecureRandom rm = new SecureRandom();
    StringBuffer sb = new StringBuffer();
    
    for(i=0; i<length; i++) {
        //무작위로 문자열의 인덱스 반환
        int index = random.nextInt(chars.length());
        //index의 위치한 랜덤값
        sb.append(chars.charAt(index));
    }
    
    return sb.toString();
}

public static void main(String[] args) {
    //비밀번호 길이 지정
    intt lenght = 10;
    System.out.println(makeRandomPw(length));
}

 

 

Seed값 변경하기

 위의 코드는 임의로 seed가 되는 문자열인 chars를 선언해 주었다. 하지만 new SecureRandom을 다시 하거나, setSeed 메서드를 이용하여 Seed값을 변경할 수 있다. 예제 코드를 보도록 하자.

 

public String makeRandomPw(int len) {
    
    //소문자, 대문자, 숫자 
    final String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    
    SecureRandom rm = new SecureRandom();
    StringBuffer sb = new StringBuffer();
    
    //시드값 변경 1번
    rm.setSeed(new Date().getTime());
    //시드값 변경 2번
    rm.setSeed(System.currentTimeMillis());