python secrets - python 표준 내장 라이브러리
목차
소개
파이썬이 3.6 버젼일 때 처음 파이썬을 공부하고 지금까지 쭉 사용해오고 있습니다(벌써 3.13 버젼이네요). 그런데 주변에 파이썬 사용하는 분들 중에 표준 내장 라이브러리를 잘 몰라서 잘 활용하지 못하는 분들을 여럿 봐서 오늘부터 파이썬 표준 내장 라이브러리들을 다루는 포스팅을 한 번 해볼까 합니다. 오늘은 첫번째로, 어제도 사용했어서 머리에 남아있는! secrets
라이브러리를 알아볼까 합니다.
Python Secrets
secrets 는 이름에서 알 수 있듯, 보안과 관련해서 난수를 생성하는데 도움을 주는 라이브러리입니다. 3.6 버젼부터 추가되었습니다.
“난수 생성은 random
라이브러리 사용하면 되는거 아님?” 이라고 생각할 수 있는데 random은 PNRG(Pseudo-Random Number Generator)를 사용해서 SEED값에 따라 랜덤이지만 순서가 정해집니다. 따라서 SEED값을 알면 순서를 알 수 있기 때문에 안전하지 않습니다.
따라서, 안전한 난수 생성은 CSPRNG(Cryptographically Secure Pseudo-Random Number Generator)을 사용하는 secrets
를 사용하는 것이 권장됩니다.
세션 생성
백엔드에서 클라이언트로 전달하는 세션을 만들때, 비밀번호 찾기 같은 보안상 민감한 링크 등을 생성할 때 쉽고 유용하게 쓸 수 있습니다.
import secrets
token = secrets.token_urlsafe(32)
# example
def get_find_password_link():
password_session =secrets.token_urlsafe(32)
return f"https://example.com/reset?token={password_session}}"
- token_urlsafe 인자값으로 길이를 설정할 수 있습니다**.**
난수 생성
난수 생성에도 좋습니다. 최근 제품과 관련해서 12자리 난수를 생성할 일이 있었는데 아래 방법으로 생성했습니다.
codes = secrets.randbelow(10**12)
print(codes)
# 645959299516
- 위와 같은 방법으로 자리수를 지정하면 됩니다. 10의12제곱보다 작은수가 생성됩니다.
- 랜덤의 순서를 예측할 수 없습니다.
암호화 키 생성
최근 포스팅했던 AES-128-CBC 암호화를 구현할 때 key를 사용했습니다.
이때 사용되는 key는 bytes 타입입니다. 이 키 또한 secrets로 생성할 수 있습니다.
encrypted_key = secrets.token_bytes(32)
print(encrypted_key)
# b'!\xdeV\xe2c\xbe\x9b\xffF\x03\x87\xf6\xd8\x8f\xda\x01\xec\x15 {Zx\xaa\x1f\xb0\x96\xfc^\x1b\xb1\xfe\x1a'
샘플링
예측불가능한 샘플링에도 사용될 수 있습니다. 예를들어 OTP 번호를 생성한다고하면 다음과 같이 할 수 있습니다. random.choice를 쓸 수도 있겠다 생각하겠지만, OTP는 예측이 불가능해야하기 때문에 secrets를 쓰는게 좋습니다. secrets의 choice는 random 라이브러리의 SystemRandom을 사용하는데 seed를 사용하지 않습니다.
def get_otp_numbers():
digits = '0123456789'
first_part = ''.join(secrets.choice(digits) for i in range(3))
second_part = ''.join(secrets.choice(digits) for i in range(3))
otp = first_part + " " + second_part
return otp
마무리
오늘은 python 표준 내장 라이브러리 secrets에 대해 알아봤습니다. 보안이 필요한 난수생성엔 random 말고 sercets를 사용 권장드립니다.