파이썬, 다양한 랜덤 값(정수, 실수, 배치, 선택, 토큰 키, 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

 

반응형

+ Recent posts