컴퓨터활용/자바

비밀번호를 난수로 발생하는 로직 (개인정보보호 지침)

멜번초이 2012. 3. 29. 15:32

프로젝트에서 비밀번호는 개인정보 보호 차원에서 아래와 같은 지침을 하달받았다. 

■ 개인정보보호 지침(관리계획)에 의거 적용

 

1 조 패스워드 설정 의무 규정

개인정보처리시스템에 접속하기 위해서는 아이디와 패스워드를 설정하여야 한다.

 

2 조 이용자 패스워드 설정 규칙

1. 이용자가 서비스 이용을 위해 계정 등록 시 패스워드는 아이디와 동일하여서는 안되며 전화번호, 생일, 주민번호 등 추측하기 쉬운 정보로 설정하여서는 안된다.

 

3 조 개인정보 취급 임직원 패스워드 설정 규칙

1. 개인정보처리시스템의 접속을 위해서는 아이디와 패스워드를 설정하여야 한다.

2. 패스워드는 다음 각 목의 문자종류 중 2종류 이상을 조합하여 최소 10자리 이상 또는 3종류 이상을 조합하여 최소 8자리 이상으로 설정하여야 한다.

    1) 영문 대문자 (26) 

2) 영문 소문자 (26) 

3) 숫자 (10) 

4) 특수문자 (32)

3. 패스워드는 전화번호, 생일, 주민번호 등 추측하기 쉬운 정보나 동일하거나 연속되는 숫자 및 문자 등을 사용하지 않는다.

4. 패스워드는 최대 6개월 이내에 정기적으로 변경하도록 설정하여야 한다.

5. IT 보안주관부서는 임직원에게 계정발급 시 패스워드 설정규칙 준수여부에 대해 확인하거나, 규칙에 어긋나는 패스워드는 사용하지 못하도록 시스템을 설정하여야 한다.


그래서  아래와 같이 날림으로 구현해 보았다.


        String  pswd = "";
       
        //  아스키문자 65번(A) 부터 26 자 중에 택일, (대문자)
        for( int i = 0; i<4; i++) {
            pswd  = pswd + Character.toString((char)((Math.random() * 26)+65));
        }
       
        //  아스키문자 97번(a) 부터 26 자 중에 택일, (소문자)
        for ( int i = 0; i<4; i++) {
            pswd  = pswd + Character.toString((char)((Math.random() * 26)+97));
        }
       
        // 아스키문자 48번(1) 부터 10 자 중에 택일, (숫자)
        for( int i = 0; i<2; i++) {
            pswd  = pswd + Character.toString((char)((Math.random() * 10)+48));
        }
       
        System.out.println("passwd = "+ pswd );


그렇다면 좀 더 응용하여 아래와 같이 코딩을 한다면

        for( int i = 0; i<10; i++) {
            pswd  = pswd + Character.toString((char)((Math.random() * 93)+33));
        }

아스키번호 33번인 ! 문자 부터 126번인 ~ 문자 까지의 문자 중에 랜덤하게 10자를 추출하여 구성하겠지요. 하지만 공교롭게도 한쪽 방향으로만 난수가 발생하여 대문자, 소문자, 숫자, 특수문자가 골고루 추출되지 못하고 편중될 가능성도 있음에 주의해야 겠지요.

결국 아래와 같이 완성한다. 

String  pswd = "";
StringBuffer sb =
new StringBuffer();
StringBuffer sc = new StringBuffer("!@#$%^&*-=?~");  // 특수문자 모음, {}[] 같은 비호감문자는 뺌

// 
대문자 4개를 임의 발생 
sb.append((char)((Math.random() * 26)+65));  // 첫글자는 대문자, 첫글자부터 특수문자 나오면 안 이쁨

for( int i = 0; i<3; i++) {
   sb.append((char)((Math.random() * 26)+65));  // 아스키번호 65(A) 부터 26글자 중에서 택일
} 

//
소문자 4개를 임의발생
for( int i = 0; i<4; i++) {
    sb.append((char)((Math.random() * 26)+97)); // 아스키번호 97(a) 부터 26글자 중에서 택일
}  


// 
숫자 2개를 임의 발생
for( int i = 0; i<2; i++) {
    sb.append((char)((Math.random() * 10)+48)); //아스키번호 48(1) 부터 10글자 중에서 택일
}


// 특수문자를 두개  발생시켜 랜덤하게 중간에 끼워 넣는다 
sb.setCharAt(((int)(Math.random()*3)+1), sc.charAt((int)(Math.random()*sc.length()-1))); //대문자3개중 하나   
sb.setCharAt(((int)(Math.random()*4)+4), sc.charAt((int)(Math.random()*sc.length()-1))); //소문자4개중 하나

pswd = sb.toString();


참고로 아스키 코드표는

Char Dec Hex Description
  32 20 Space
! 33 21 Exclamation mark
" 34 22 Quotation mark (&quot; in HTML)
# 35 23 Cross hatch (number sign)
$ 36 24 Dollar sign
% 37 25 Percent sign
& 38 26 Ampersand
` 39 27 Closing single quote (apostrophe)
( 40 28 Opening parentheses
) 41 29 Closing parentheses
* 42 2a Asterisk (star, multiply)
+ 43 2b Plus
, 44 2c Comma
- 45 2d Hyphen, dash, minus
. 46 2e Period
/ 47 2f Slant (forward slash, divide)
0 48 30 Zero
1 49 31 One
2 50 32 Two
3 51 33 Three
4 52 34 Four
5 53 35 Five
6 54 36 Six
7 55 37 Seven
8 56 38 Eight
9 57 39 Nine
: 58 3a Colon
; 59 3b Semicolon
< 60 3c Less than sign
= 61 3d Equals sign
> 62 3e Greater than sign
? 63 3f Question mark
@ 64 40 At-sign
A 65 41 Uppercase A
B 66 42 Uppercase B
C 67 43 Uppercase C
D 68 44 Uppercase D
E 69 45 Uppercase E
F 70 46 Uppercase F
G 71 47 Uppercase G
H 72 48 Uppercase H
I 73 49 Uppercase I
J 74 4a Uppercase J
K 75 4b Uppercase K
L 76 4c Uppercase L
M 77 4d Uppercase M
N 78 4e Uppercase N
O 79 4f Uppercase O
P 80 50 Uppercase P
Q 81 51 Uppercase Q
R 82 52 Uppercase R
S 83 53 Uppercase S
T 84 54 Uppercase T
U 85 55 Uppercase U
V 86 56 Uppercase V
W 87 57 Uppercase W
X 88 58 Uppercase X
Y 89 59 Uppercase Y
Z 90 5a Uppercase Z
[ 91 5b Opening square bracket
\ 92 5c Reverse slant (Backslash)
] 93 5d Closing square bracket
^ 94 5e Caret (Circumflex)
_ 95 5f Underscore
` 96 60 Opening single quote
a 97 61 Lowercase a
b 98 62 Lowercase b
c 99 63 Lowercase c
d 100 64 Lowercase d
e 101 65 Lowercase e
f 102 66 Lowercase f
g 103 67 Lowercase g
h 104 68 Lowercase h
i 105 69 Lowercase i
j 106 6a Lowercase j
k 107 6b Lowercase k
l 108 6c Lowercase l
m 109 6d Lowercase m
n 110 6e Lowercase n
o 111 6f Lowercase o
p 112 70 Lowercase p
q 113 71 Lowercase q
r 114 72 Lowercase r
s 115 73 Lowercase s
t 116 74 Lowercase t
u 117 75 Lowercase u
v 118 76 Lowercase v
w 119 77 Lowercase w
x 120 78 Lowercase x
y 121 79 Lowercase y
z 122 7a Lowercase z
{ 123 7b Opening curly brace
| 124 7c Vertical line
} 125 7d Closing curly brace
~ 126 7e Tilde (approximate)
127 7f Delete (rubout), cross-hatch box