파이썬, 다양한 랜덤 값(정수, 실수, 배치, 선택, 토큰 키, url) 생성 예
글. 수알치 오상문
import os
import secrets # Python 3.9
import random
import time
random.seed(time.time()) # 랜덤 씨앗 값 설정
# 랜덤 바이트 문자열 출력
print(os.urandom(32))
print(secrets.token_bytes(32))
print(secrets.token_bytes()) # 바이트 길이 생략하면 기본값 길이 사용
print(random.randbytes(32))
[결과]
b'* \x8c\xb6\xd7\xd7\x93#,\xe4\xf95<C\xe5Y\x92\n\xc1\xba+i\xc6N\xf6\xab3\xc6\xd8:\x9c\xac'
b'g\xa9c\xa2\xf7B\xc8z)\xfaO\xda4\x8epS&\xb9\xad\xab\xde\xfe\xe8A\x8f\xc9\x1b\xe3\x92\x11*\xe1'
b'\x04!\x15\xf1AG{*"m\xf4\n;\xae\x02\xc7\xd6\xd9\xe2\xbd]\xc5D\x9a\xbas\xee\xec\x1d\xdfm\x9a'
b'\x19\x03-\xee\xbe\xf1\xad{\x96&\xc1\x1by}\xbc\xd7\xe1\xd6%r\xda\x85@\xfc\xbd\xb4\xb0D\xb7,\xc4N'
# 랜덤 정수 출력
for i in range(3):
print(i, ':', random.randint(0, 2)) # 0 <= 랜덤값 <= n
print(i, ':', secrets.randbelow(2)) # 0 <= 랜덤값 < n
print(i, ':', random.randrange(1,11,3)) # 1, 4, 7, 10 중에서
[결과]
0 : 0
0 : 0
0 : 10
1 : 2
1 : 1
1 : 1
2 : 1
2 : 0
2 : 1
# 랜덤 실수 1
for i in range(3):
print(i, ':', random.random()) # 0.0 <= 랜덤값 < 1.0
[결과]
0 : 0.08268848093003345
1 : 0.3621296254784214
2 : 0.6786460202193171
# 랜덤 실수 2
for i in range(3):
print(i, ':', random.uniform(0, 10)) # 0.0 <= 랜덤값 <= 10.0
[결과]
0 : 7.665538973581127
1 : 3.056399463110946
2 : 7.14719986007757
# 랜덤 항목
weekday = ['월', '화', '수', '목', '금', '토', '일']
print(secrets.choice(weekday))
[결과]
금
# 여러 개 중에서 중복되지 않는 항목들 선택
weekday = ['월', '화', '수', '목', '금', '토', '일']
print(random.sample(weekday, 3))
[결과]
['일', '월', '화']
# 여러 개 항목의 순서를 랜덤하게 배치
weekday = ['월', '화', '수', '목', '금', '토', '일']
random.shuffle(weekday)
print(weekday)
[결과]
['수', '월', '목', '금', '토', '일', '화']
# 랜덤 비트
for i in range(3):
print(secrets.randbits(8)) # 8비트 범위 랜덤 값
[결과]
148
91
227
# 랜덤 16진수 텍스트 문자열
for i in range(3):
print(secrets.token_hex(4))
[결과]
b8a7fef6
cff4cd2a
4b141f5e
# 랜덤 url 문자열 값
for i in range(3):
print(secrets.token_urlsafe(8))
[결과]
pWErDRE3vnI
vfa6Uq0GV5Q
u-M6RiXR5iU
[참고] 문자열 비교 시, 반환 시간을 이용한 공격을 방어하는 문자열 비교 함수 compare_digest()
문자열 비교에서 앞이 틀리면 빨리 반환되고, 뒤로 갈 수록 늦게 반환되는 점을 노리는 시간차 공격을 막아준다.
두 문자열이 같으면 True, 다르면 False
print(secrets.compare_digest("password"*32, "password"*32))
[결과]
True
'Python 기초' 카테고리의 다른 글
날짜 시간 포맷, strftime 함수 (0) | 2022.07.07 |
---|---|
파이썬, 이전 달의 1일과 말일 구하는 예제 (0) | 2022.07.05 |
파이썬, 문자열에서 숫자만 추출하는 예제 (0) | 2022.07.02 |
파이썬, 상위 하위 디렉터리/폴더 패키지/모듈 import (0) | 2022.06.27 |
윈도우 11, python pip 동작 안 할 때 (0) | 2022.06.17 |