본문 바로가기

IT/Java

19_비밀번호 생성기 만들기

어느 날 심심해서 비밀번호 생성기를 만들어봤다.

사실 심심해서 만든 건 아니다.

 

얼마전(.....무려 6개월 전이네) 스팸메일함을 보고 깜짝 놀랐다.

메일 제목이 수년 전에 사용하던 비밀번호로 되어 있었기 때문이다.

이런 메일은 원래 열어보지 않는 것이 제일 좋지만 그래도 호기심을 참지 못하고 클릭해버렸다.

내용은 흔하디 흔한, 비트코인을 보내지 않으면 컴퓨터의 자료를 모두 망가뜨리고 개인정보까지 유출시키겠다는 이야기.

 

제목에 적혀있는 비밀번호도 어차피 엄청 옛날에 쓰던 것이고 메일 내용 자체도 말도 안 되는 이야기라 바로 삭제했지만

여러 사이트에서 같은 비밀번호를 사용하는 것이 얼마나 위험한지 새삼 느끼게 되었다.

그래서 비밀번호를 나름 나누어 사용하기로 결심했는데...

새로운 비밀번호를 만들어내기가 너무 귀찮아서 간단하게 생성기를 만들었다.

 

물론, 많은 사람들이 안전하다고 이야기 하는 패스워드매니저 같은 앱들이 있지만

의심이 많은 나는 그것조차도 불안해서 사용을 못 하고 있다.

 

아무튼 이 생성기는 나 혼자 쓰려고 만든거라 예외처리는 하지 않았다.

 

간단하게 설명하자면

 

1. 1부터 122까지의 랜덤숫자를 발생시킨다. (Math.random() 사용)

2. 아스키코드를 사용하여, 1번에서 얻어낸 난수에 해당하는 문자를 배열에 저장한다.

3. 이 때, 숫자/영문대소문자/일부 특수문자만 사용할 수 있다.

4. 사용자는 비밀번호의 길이를 정할 수 있다.

5. 사용자는 비밀번호에 특수문자를 포함할 것인지 아닌지 결정할 수 있다.

6. 사용자는 한꺼번에 여러개의 비밀번호를 생성할 수 있다.

 

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
public class PasswordGeneratorSets {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("몇 자리의 비밀번호를 만드시겠습니까?");
        int longueur = sc.nextInt();
        System.out.println("[1] 특수문자 포함  [2] 특수문자 미포함");
        int sel = sc.nextInt();
        System.out.println("비밀번호를 몇 세트 만드시겠습니까?");
        int set = sc.nextInt();
      
 
        for (int i = 0; i < set; i++) {
            char[] values = new char[longueur];
 
        //longueur를 그대로 사용하면 밑에서 longueur 값이  0으로 되어 2회전부터 ArrayIndexOutOfBoundsException발생
            int index = longueur;
int cnt = 0// 특수문자의 개수. 1 set 완료되면 다시 0으로 초기화되어야 하므로 for문 내부에 선언한다.
 
            do {
                int temp = getRand();
                if ((temp >= 48 && temp <= 57|| (temp >= 65 && temp <= 90|| (temp >= 97 && temp <= 122)) {
                    values[index - 1= (char) temp; // 마지막 인덱스 부터 거꾸로 값을 넣는다. 어차피 상관 없잖아.
                    index--;
                }
 
            // 특수문자 처리
                if (sel == 1) {
                    if ((temp == 33|| (temp >= 59 && temp <= 62|| (temp >= 94 && temp <= 95)) {
                        values[index - 1= (char) temp;
                        index--;
                        cnt++;
                    }
                } // end if(sel==1)
 
            //나는 1번옵션을 선택했고 && 마지막 숫자까지 다 채웠는데 && 특수문자가 0개야... 그러면 인덱스를 오른쪽으로 하나 옮겨서 다시 뽑기한다. 특수문자 들어갈 때 까지.
                if(sel==1 && index==0 && cnt==0) index++;
                
            } while (index > 0);
            
            // 배열 출력
            for (char value : values) {
                System.out.print(value);
            } System.out.println();
        }
        sc.close();
    }
 
    // 랜덤숫자 생성
    public static int getRand() {
        int rand = (int) (Math.random() * 122+ 1;
        return rand;
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter