Secure Coding
패스워드 정책
best
2016. 4. 28. 09:57
1. 일반적으로 권고되는 패스워드 정책
- 대/소문자, 숫자, 특수문자를 혼용하여 8 글자 이상의 패스워드를 사용하도록 한다.
- 동일 문자를 연속 4회이상 사용하지 못하도록 한다.
- 패스워드 히스토리를 관리해 2~3개 이상 동일 패스워드를 사용하지 못하도록 한다.
- 패스워드 변경 주기를 설정한다. ( 패스워드 유효기간을 90일 이하로 설정 )
- 연속적인 숫자/문자 조합 및 생일, 전화번호 등 추측하기 쉬운 패스워드 사용을 금지한다.
- 사전에 나오는 쉬운 단어나 이름은 패스워드로 사용하지 못하도록 한다.
- 기본 설정된 패스워드는 사용하지 못하도록 설정한다.
- 초기 부여된 패스워드는 사용자 최초 접속시 변경하도록 한다.
2. 패스워드 체크를 위한 시큐어 코딩 기법
권고되는 패스워드 정책 중에서 하나 이상의 알파벳, 숫자, 특수문자를 포함하는지 체크 / 최소 8글자 이상인지 체크
컨트롤러에서 비밀번호를 체크하기 위한 method를 수행
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 |
@RequestMapping("/member/registry" )
public void registryMember(MemberRegistryVO memberVO, HttpServletResponse response) {
try {
// 회원가입시 비밀번호 체크하기
/*
* 하나 이상의 알파벳을 포함해야 함
* 하나 이상의 숫자를 포함해야 함
* 하나 이상의 특수문자를 포함해야 함
* 최소 8글자 이상 입력해야 함
*/
boolean isVerifyPassword = verify(memberVO.getUserPassword());
if( !isVerifyPassword ){
//password가 취약하다면 addMember를 하지 않고 취약하다는 것을 사용자에게 알려준다.
SendMessage.send(response, "-1");
return;
}
memberService.addMember(memberVO);
SendMessage.send(response, "OK");
}
catch(RuntimeException re) {
re.printStackTrace();
SendMessage.send(response, memberVO.getUserId() + "은(는) 이미 등록된 아이디 입니다.");
}
}
public boolean verify(String password) {
/* String alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int alphaCount = 0;
for (int i = 0; i <password.length(); i++){
if (alpha.indexOf( (password.charAt(i) + "")) != -1){
alphaCount ++;
}
}
String numbers = "0123456789";
int numberCount = 0;
for (int i = 0; i <password.length(); i++){
if (numbers.indexOf( (password.charAt(i) + "")) != -1){
numberCount ++;
}
}
String symbols = "!@#$%^&*()_+-=[]{}/<>?,.;':`~";
int symbolsCount = 0;
for (int i = 0; i <password.length(); i++){
if (symbols.indexOf( (password.charAt(i) + "")) != -1){
symbolsCount ++;
}
}
if ( alphaCount == 0 || symbolsCount == 0 || numberCount == 0 ){
return false;
}
return true;*/
String passwordPolicy = "((?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#$%^&*()-=+]).{8,})";
Pattern pattern = Pattern.compile(passwordPolicy);
Matcher matcher = pattern.matcher(password);
return matcher.matches();
} |
cs |
정규표현식을 사용하지 않으면 특수문자, 숫자, 알파벳이 각각 존재하는지 for문을 이용해 체크해야 한다.