임시번호를 만들기 위해 여러가지 방법이 있지만,
이번에는 python 모듈중 string
모듈을 통해 난수를 만들고, 임시번호를 생성해보고자 한다.
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
여기서 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_letters
는 ascii_lowercase
와 ascii_uppercase
상수를 이어붙인 것.
[2] string
모듈의 digits는 문자열 1234567890
[3] string
모듈의 punctuaction는 C 로케일에서 구두점 문자로 간주하는 ASCII 문자의 문자열 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.
[4] 위 모든 문자열을 합쳐서 string_pool
변수로 저장
임시 패스워드를 만들기 위해 필요한 모듈이 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
임시패스워드를 만드는 정책은 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