본문 바로가기
Back/Java

[JAVA][시큐어코딩] 적절하지 않은 난수 값 사용

by 은z 2024. 8. 1.

상황

프로젝트 마무리 단계에서 소스코드 보안약점 진단 실행 후, 수정이 필요한 사항이 생겼다.

적절하지 않은 난수 값 사용에 대한 개념과 수정 방안에 대해 정리해보겠다.

 

 


 

✔️적절하지 않은 난수 값 사용 ???

공격자가 예측 가능한 난수를 사용할 경우 다음 숫자를 예상하여 공격이 가능해지는 보안약점을 일컫는다.난수란 특정한 순서나 규칙을 가지지 않는 수를 뜻하는데, 난수 값을 결정하는 시드 (Seed) 값이 고정될 경우 예측 가능한 난수값이 생성된다고 한다.

 

 

 

✔️보안 대책

JAVA의 java.lang.Math.random() 메소드 사용을 자제해야 한다.예측이 거의 불가능하게 암호학적으로 보호된 java.security.SecureRandom 클래스를 사용하는 것이 안전하다.

 

 

✔️보안 취약점 대응

📌 [수정 전]

/**
 * 랜덤 난수 생성 (숫자 + 영문 대문자 조합)
 *
 * @param len 길이
 * @return 랜덤 난수 문자열
 */
public static String getRandomPassword(int len) {
    char[] charSet = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
            'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
    int idx = 0;
    String idxString = "";
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < len; i++) {
        idx = (int) (charSet.length * Math.random()); // 36 * 생성된 난수를 Int로 추출 (소숫점제거)
        idxString += idx + " ";
        sb.append(charSet[idx]);
    }
    log.debug("idx :::: " + idxString);
    return sb.toString();
}

✏️ Math.random() 메소드 사용하고 있는 것을 볼 수 있다.

 

 

 

📌 [수정 후]

/**
 * 랜덤 난수 생성 (숫자 + 영문 대문자 조합)
 *
 * @param len 길이
 * @return 랜덤 난수 문자열
 */
public static String getRandomNumberAndChar(int len) {
    String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    SecureRandom random = new SecureRandom();
    StringBuilder sb = new StringBuilder(len);

    for (int i = 0; i < len; i++) {
        int index = random.nextInt(characters.length());
        sb.append(characters.charAt(index));
    }
    return sb.toString();
}

✏️위에 수정된 코드를 보면 SecureRandom  클래스를 사용하고 있다.

 

댓글