상황
프로젝트 마무리 단계에서 소스코드 보안약점 진단 실행 후, 수정이 필요한 사항이 생겼다.
적절하지 않은 난수 값 사용에 대한 개념과 수정 방안에 대해 정리해보겠다.
✔️적절하지 않은 난수 값 사용 ???
✔️보안 대책
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 클래스를 사용하고 있다.
'Back > Java' 카테고리의 다른 글
[JAVA][시큐어코딩] Null Pointer 역참조에 대응하기 (0) | 2024.08.01 |
---|---|
[JAVA] 파일 관련 Stream, I/O 성능 개선 (File 복사 기능) (2) | 2024.07.24 |
[JAVA] Stream Collectors.groupingBy 널(null) 사용하기 (0) | 2023.04.07 |
[Java] Stream 스트림으로 중복 값 찾기 (0) | 2023.02.22 |
[Java] Optional 개념, 사용법 (1) | 2023.02.21 |
댓글