The secrets module is used for generating cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets.
In particular, secrets should be used in preference to the default pseudo-random number generator in the random module, which is designed for modelling and simulation, not security or cryptography.

secrets 모듈은 파이썬 3.6부터 추가된 모듈입니다.

이 모듈을 사용하면 암호학적으로 강력한(cryptographically strong) 랜덤한 토큰을 만들어낸다고 합니다. random 모듈은 보안이나 암호를 목적으로 사용하면 안된다고 문서에 강조돼있습니다.

>>> import secrets

>>> secrets.token_hex(nbytes=16)
'17adbcf543e851aa9216acc9d7206b96'

>>> secrets.token_urlsafe(16)
'X7NYIolv893DXLunTzeTIQ'

>>> secrets.token_bytes(128 // 8)
b'\x0b\xdcA\xc0.\x0e\x87\x9b`\x93\\Ev\x1a|u'

nbytes 입력하면 입력한 만큼 hex 또는 byte string으로 변환해 랜덤한 토큰을 반환합니다. url-safe한 토큰을 만드는 것도 가능하네요. token_urlsafe는 base64 인코드된 값을 반환한다고 써있습니다.

nbytes is None이라면 모듈이 판단했을 때 적절한 값을 넣는다고 하는군요

DEFAULT_ENTROPY = 32  # number of bytes to return by default

# ...

def token_bytes(nbytes=None):
    """Return a random byte string containing *nbytes* bytes.

    If *nbytes* is ``None`` or not supplied, a reasonable
    default is used.

    >>> token_bytes(16)  #doctest:+SKIP
    b'\\xebr\\x17D*t\\xae\\xd4\\xe3S\\xb6\\xe2\\xebP1\\x8b'

    """
    if nbytes is None:
        nbytes = DEFAULT_ENTROPY
    return os.urandom(nbytes)

python3.8 기준으로 확인해보니 DEFAULT_ENTROPY == 32로 나와 있습니다.

이건 그냥 궁금해서 찾아본 tmi입니다

반응형