비밀번호 보안/강력도 확인 (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
|
[False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
|
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 |
'공부 > 파이썬 Python' 카테고리의 다른 글
구글 검색 알고리즘 구현하기 with Python (0) | 2022.01.31 |
---|---|
Password Generator (자동 비밀번호 생성기) with Python (0) | 2022.01.29 |
Pomodoro 뽀모도로 공부 타이머 만들기 (feat. Python, Threading) (0) | 2022.01.23 |
파이썬으로 3D 게임 만들기 (feat. Ursina) (0) | 2022.01.23 |
Python 3D 플로팅 연습하기 (0) | 2022.01.04 |
댓글