[Python] 난수로 임시비밀번호 생성하기

황인용·2020년 12월 21일
0

Python

목록 보기
44/44
post-thumbnail

INTRO

임시번호를 만들기 위해 여러가지 방법이 있지만,
이번에는 python 모듈중 string모듈을 통해 난수를 만들고, 임시번호를 생성해보고자 한다.

string module

Python에 내장된 모듈 string은 다음과 같은 method가 존재한다

import string

>>> string.
string.Formatter(       string.ascii_lowercase  string.digits           string.printable
string.Template(        string.ascii_uppercase  string.hexdigits        string.punctuation
string.ascii_letters    string.capwords(        string.octdigits        string.whitespace

string method 참고
string -- 일반적인 문자열 연산 -- 문자열 상수 -- python

create string_pool

여기서 ascii_letters, digits, punctuaction 3가지 모듈을 사용하여 난수를 만들어 보고자한다.

from string import ascii_letters
from string import digits
from string import punctuation


>>> [1]ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

>>> [2]digits
'0123456789'

>>> [3]punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

>>> [4]string_pool = ascii_letters + digits + punctuaction
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

[1] string 모듈의 ascii_lettersascii_lowercaseascii_uppercase상수를 이어붙인 것.
[2] string 모듈의 digits는 문자열 1234567890
[3] string 모듈의 punctuaction는 C 로케일에서 구두점 문자로 간주하는 ASCII 문자의 문자열 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.
[4] 위 모든 문자열을 합쳐서 string_pool 변수로 저장

secret module

임시 패스워드를 만들기 위해 필요한 모듈이 secrets 모듈이다.
특히 위에서 만든 string_pool에서 난수로 문자열을 선택하여, 난수 문자열을 만들어야 하기에
secrets 모듈에서 choice 메소드를 활용한다.

>>> secrets.
secrets.DEFAULT_ENTROPY  secrets.binascii         secrets.os               secrets.token_bytes(
secrets.SystemRandom(    secrets.choice(          secrets.randbelow(       secrets.token_hex(
secrets.base64           secrets.compare_digest(  secrets.randbits(        secrets.token_urlsafe(

secrets의 method 참고
Generate secure random numbers for managing secrets -- python3.8.6

create temp_password

임시패스워드를 만드는 정책은 case by case 이다.
KISA(한국인터넷진흥원)에서 가이드하는 안전한 패스워드 정책은
2가지 이상의 문자열을 대소문자조합 그리고 10자리 이상이다.
따라서 비슷한 정책으로 2가지 문자열(ascii_letters, digits)를 포함하여 10자리의 임시 패스워드를 만들어 보고자 한다.

KISA(한국인터넷진흥원)의 안전한 패스워드 가이드 참고
기술안내서--패스워드선택 및 이용 안내서

>>>[1]import string
>>>[2]import secrets
>>>[3]string_pool = string.ascii_letters + string.digits
>>>[4]while True:
...		[4-1]temp_password = ''.join(secrets.choice(string_pool) for i in range(10))
... 		[4-2]if (any(c.islower() for c in temp_password)
...     	    [4-3]and any(c.isupper() for c in temp_password)
...         	[4-4]and sum(c.isdigit() for c in temp_password) >= 3):
...     	[4-5]break
        
>>> temp_password
K8D7Hn6J7k

[1] string 모듈 가져오기
[2] secrets 모듈 가져오기
[3] string_pool이라는 문자열 변수 생성
[4] while 문으로 임시패스워드(난수)만드는 반복문 시작
[4-1] string_pool에서 random으로 문자를 하나씩 선택, 그리고 .join()으로 문자열을 붙여서 temp_password변수에 저장
[4-2] temp_password 안에 소문자(.islower()) 있는지 확인
[4-3] 그리고, temp_password 안에 대문자(.isupper()) 있는지 확인
[4-4] 그리고, temp_password 안에 숫자문자열(.isdigit()) 있는지 확인(3개 이상)
[4-5][4-2], [4-3], [4-4]가 충족하면 break

profile
dev_pang의 pang.log

0개의 댓글