본문 바로가기
공부/파이썬 Python

비밀번호 강력도 확인 (Password Strength Checker) with Python

by 혼밥맨 2022. 1. 26.
반응형

비밀번호 보안/강력도 확인 (Password Strength Checker) with Python

 

필요 라이브러리

 - string

1
import string
cs

 

자신의 비밀번호가 얼마나 강력한지 확인하는 비밀번호 확인 기계를 만들어 봅니다. 그뿐만 아니라 웹사이트 회원가입을 할 때 비밀번호가 위험에 얼마나 취약한 지는 어떻게 확인하는 지 알아보겠습니다. 

 

우선 자신의 비밀번호를 password 변수에 저장합니다.

1
2
3
import string
 
password = "ilovenewyorkusa"
cs

 

그리고 password의 캐릭터 하나 하나를 체크합니다.

 

우선적으로 비밀번호가 uppsecase 즉, 대문자를 포함하는 지 확인하는 list comprehension을 작성합니다.

1
upper_case = [True if c in string.ascii_uppercase else False for c in password]
cs

 

현재 password는 'ilovenewyorkusa'로 대문자가 하나도 없으니 결과는 당연히 아래와 같이 False로 꽉 찬 리스트가 upper_case 변수에 저장됩니다.

1
[FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse]
cs

 

True와 False와 같은 Boolean type 변수가 너무 길다면 숫자 1과 0으로 변환해도 문제 없습니다.

1
upper_case = [1 if c in string.ascii_uppercase else 0 for c in password]
cs

 

그런데 현재 우리는 각각의 캐릭터가 대문자인지 아닌지 확인하는 것이 아닌, password 변수가 저장하는 value가 대문자를 포함하고 있는지 아닌지가 궁금합니다.

 

any

1
upper_case = any([1 if c in string.ascii_uppercase else 0 for c in password])
cs

Any는 리스트 엘리먼트 (elements in list) 하나의 값만 True라면 True를 반환하고, True가 하나도 없는 경우 (전부 False인 경우에는)는 False를 리턴합니다.

 

예를 들어, any([1,0,0,0])는 True를, any([0,0,0,0,0,0]는 False를 리턴합니다.

 

 

any가 있기 때문에 비밀번호가 대문자, 소문자, 특수문자, 숫자를 포함하는지 한 번에 확인할 수 있는 코드를 작성할 수 있게 되었습니다.

1
2
3
4
5
6
7
8
9
10
11
password = "ilovenewyorkusa"
 
upper_case = any([1 if c in string.ascii_uppercase else 0 for c in password])
lower_case = any([1 if c in string.ascii_lowercase else 0 for c in password])
special = any([1 if c in string.punctuation else 0 for c in password])
digits = any([1 if c in string.digits else 0 for c in password])
 
print(upper_case)
print(lower_case)
print(special)
print(digits)
cs

 

현재 password는 소문자로만 이루어져 있기 때문에 결과는 당연히 lower_case만 True 값을 반환할 것입니다.

1
2
3
4
False
True
False
False
cs

비밀번호 보안 등급 점수 모델 생성하기

1. 비밀번호 길이에 따라 점수 부여

비밀번호의 길이가 길수록 보안에 덜 취약합니다.

비밀번호 길이가 길수록 높은 점수를 부여할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
length = len(password)
 
score = 0
 
# 비밀번호 길이 점수 최대 4점
if length > 8:
    score = score + 1
if length > 12:
    score = score + 1
if length > 17:
    score = score + 1
if length > 20:
    score = score + 1
cs

 

2. 비밀번호 다양성에 따라 점수 부여

비밀번호가 대문자, 소문자, 특수문자, 숫자를 모두 포함하면 3점, 이 중 하나로만 이루어져 있으면 0점을 부여하는 로직입니다.

1
2
3
4
5
6
7
8
9
characters = [upper_case, lower_case, special, digits]
 
# 비밀번호 다양성 점수 최대 3점
if sum(characters) > 1:
    score = score + 1
if sum(characters) > 2:
    score = score + 1
if sum(characters) > 3:
    score = score + 1
cs

 

3. 비밀번호 총점으로 보안 등급 구분하기

총 4개의 등급으로 구분했는데요, 등급은 3개로 할 수도 있고, 합/불합 이렇게 나눌 수도 있습니다.

 

1
2
3
4
5
6
7
8
9
# 점수에 따른 비밀번호 보안 등급
if score < 4:
    print(f"비밀번호가 위험에 노출될 가능성이 큽니다. 점수: {str(score)} / 7")
elif score == 4:
    print(f"비밀번호 보안등급은 보통입니다. 점수: {str(score)} / 7")
elif score > 4 and score < 6:
    print(f"비밀번호 보안등급이 우수합니다. 점수: {str(score)} / 7")
elif score < 6:
    print(f"비밀번호가 아주 강력합니다. 점수: {str(score)} / 7")
cs

 

 

Full Code

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
import string
 
password = "ilovenewyorkusa"
 
# 비밀번호 캐릭터의 종류
upper_case = any([1 if c in string.ascii_uppercase else 0 for c in password])
lower_case = any([1 if c in string.ascii_lowercase else 0 for c in password])
special = any([1 if c in string.punctuation else 0 for c in password])
digits = any([1 if c in string.digits else 0 for c in password])
 
print(upper_case)
print(lower_case)
print(special)
print(digits)
 
# 비밀번호 길이
length = len(password)
 
# 비밀번호 
score = 0
 
# 비밀번호 길이 점수 최대 4점
if length > 8:
    score = score + 1
if length > 12:
    score = score + 1
if length > 17:
    score = score + 1
if length > 20:
    score = score + 1
 
print(f"Password length is {str(length)}, adding {str(score)} points!")
 
characters = [upper_case, lower_case, special, digits]
 
# 비밀번호 다양성 점수 최대 3점
if sum(characters) > 1:
    score = score + 1
if sum(characters) > 2:
    score = score + 1
if sum(characters) > 3:
    score = score + 1
 
print(f"Password has {str(sum(characters))} different character types, adding {str(sum(characters)-1)} points!")
 
 
# 점수에 따른 비밀번호 보안 등급
if score < 4:
    print(f"비밀번호가 위험에 노출될 가능성이 큽니다. 점수: {str(score)} / 7")
elif score == 4:
    print(f"비밀번호 보안등급은 보통입니다. 점수: {str(score)} / 7")
elif score > 4 and score < 6:
    print(f"비밀번호 보안등급이 우수합니다. 점수: {str(score)} / 7")
elif score < 6:
    print(f"비밀번호가 아주 강력합니다. 점수: {str(score)} / 7")
cs

 

반응형

댓글