티스토리 뷰

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문을 이용해 체크해야 한다. 


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함