[보안/SER-004] 임시비밀번호 생성 난수를 SecureRandom 으로 교체
CWE-330(취약한 난수). BizEntrprsFrtManageController.randomValue 가 임시비밀번호를 Math.random()/java.util.Random 으로 생성 → 시드 예측 가능. 암호학적 안전 난수 (SecureRandom)로 교체하고 문자 분포는 정수 범위(nextInt)로 균등 생성. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AbEjijyQdS54xso1d2ks3u
This commit is contained in:
parent
d75c0da00e
commit
e82e0611c0
@ -3,7 +3,7 @@ package kr.or.arko.frt.biz.umt.web;
|
|||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.security.SecureRandom;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
@ -491,57 +491,60 @@ public class BizEntrprsFrtManageController {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public String randomValue(String type, int size) {
|
public String randomValue(String type, int size) {
|
||||||
|
// [보안/SER-004] 임시비밀번호 생성 난수를 예측 가능한 Math.random()/java.util.Random 에서
|
||||||
|
// 암호학적 안전 난수(SecureRandom)로 교체(CWE-330). 문자 분포는 정수 범위로 균등 생성한다.
|
||||||
StringBuffer strPwd = new StringBuffer();
|
StringBuffer strPwd = new StringBuffer();
|
||||||
char str[] = new char[1];
|
char str[] = new char[1];
|
||||||
// 특수기호 포함
|
// 특수기호 포함
|
||||||
if (type.equals("P")) {
|
if (type.equals("P")) {
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
str[0] = (char) ((Math.random() * 94) + 33);
|
str[0] = (char) (SECURE_RANDOM.nextInt(94) + 33);
|
||||||
strPwd.append(str);
|
strPwd.append(str);
|
||||||
}
|
}
|
||||||
} else if (type.equals("A")) {
|
} else if (type.equals("A")) {
|
||||||
// 대문자로만
|
// 대문자로만
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
str[0] = (char) ((Math.random() * 26) + 65);
|
str[0] = (char) (SECURE_RANDOM.nextInt(26) + 65);
|
||||||
strPwd.append(str);
|
strPwd.append(str);
|
||||||
}
|
}
|
||||||
} else if (type.equals("S")) {
|
} else if (type.equals("S")) {
|
||||||
// 소문자로만
|
// 소문자로만
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
str[0] = (char) ((Math.random() * 26) + 97);
|
str[0] = (char) (SECURE_RANDOM.nextInt(26) + 97);
|
||||||
strPwd.append(str);
|
strPwd.append(str);
|
||||||
}
|
}
|
||||||
} else if (type.equals("I")) {
|
} else if (type.equals("I")) {
|
||||||
// 숫자형으로
|
// 숫자형으로
|
||||||
int strs[] = new int[1];
|
int strs[] = new int[1];
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
strs[0] = (int) (Math.random() * 9);
|
strs[0] = SECURE_RANDOM.nextInt(9);
|
||||||
strPwd.append(strs[0]);
|
strPwd.append(strs[0]);
|
||||||
}
|
}
|
||||||
} else if (type.equals("C")) {
|
} else if (type.equals("C")) {
|
||||||
// 소문자, 숫자형
|
// 소문자, 숫자형
|
||||||
Random rnd = new Random();
|
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
if (rnd.nextBoolean()) {
|
if (SECURE_RANDOM.nextBoolean()) {
|
||||||
strPwd.append((char) ((int) (rnd.nextInt(26)) + 97));
|
strPwd.append((char) (SECURE_RANDOM.nextInt(26) + 97));
|
||||||
} else {
|
} else {
|
||||||
strPwd.append((rnd.nextInt(10)));
|
strPwd.append((SECURE_RANDOM.nextInt(10)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (type.equals("T")) {
|
} else if (type.equals("T")) {
|
||||||
// 대문자, 숫자형
|
// 대문자, 숫자형
|
||||||
Random rnd = new Random();
|
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
if (rnd.nextBoolean()) {
|
if (SECURE_RANDOM.nextBoolean()) {
|
||||||
strPwd.append((char) ((int) (rnd.nextInt(26)) + 65));
|
strPwd.append((char) (SECURE_RANDOM.nextInt(26) + 65));
|
||||||
} else {
|
} else {
|
||||||
strPwd.append((rnd.nextInt(10)));
|
strPwd.append((SECURE_RANDOM.nextInt(10)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return strPwd.toString();
|
return strPwd.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** [보안/SER-004] 임시비밀번호용 암호학적 안전 난수원(thread-safe, 공유). */
|
||||||
|
private static final SecureRandom SECURE_RANDOM = new SecureRandom();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************
|
/**********************************************************
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user