Program Club

파이썬에서 암호 학적으로 안전한 난수를 어떻게 만들 수 있습니까?

proclub 2020. 12. 3. 20:47
반응형

파이썬에서 암호 학적으로 안전한 난수를 어떻게 만들 수 있습니까?


파이썬으로 프로젝트를 만들고 있는데 암호 학적으로 안전한 난수를 만들고 싶습니다. 어떻게 할 수 있습니까? 나는 온라인에서 정규 랜덤 화기에 의해 생성 된 숫자가 암호 학적으로 안전하지 않으며 함수 os.urandom(n)가 숫자가 아닌 문자열을 반환 한다는 것을 읽었습니다 .


다음 과 같이에서 ord반환 된 바이트에 함수를 적용하여 난수 목록을 얻을 수 있습니다.os.urandom

>>> import os
>>> os.urandom(10)
'm\xd4\x94\x00x7\xbe\x04\xa2R'
>>> type(os.urandom(10))
<type 'str'>
>>> map(ord, os.urandom(10))
[65, 120, 218, 135, 66, 134, 141, 140, 178, 25]

인용 os.urandom문서,

암호화 사용에 적합한n 임의의 바이트 문자열을 반환합니다 .

이 함수는 OS 별 임의성 소스에서 임의의 바이트를 반환합니다. 반환 된 데이터는 암호화 애플리케이션에 대해 충분히 예측할 수 없지만 정확한 품질은 OS 구현에 따라 달라집니다. UNIX 계열 시스템에서는을 쿼리 /dev/urandom하고 Windows에서는 CryptGenRandom().


특정 범위의 정수를 생성하고 싶기 때문에 random.SystemRandom대신 클래스 를 사용하는 것이 훨씬 쉽습니다 . 해당 클래스의 인스턴스를 만들면 random모듈 의 모든 메서드를 지원 하지만 내부에서 사용 하는 개체가 제공 os.urandom()됩니다. 예 :

>>> from random import SystemRandom
>>> cryptogen = SystemRandom()
>>> [cryptogen.randrange(3) for i in range(20)] # random ints in range(3)
[2, 2, 2, 2, 1, 2, 1, 2, 1, 0, 0, 1, 1, 0, 0, 2, 0, 0, 0, 0]
>>> [cryptogen.random() for i in range(3)]  # random floats in [0., 1.)
[0.2710009745425236, 0.016722063038868695, 0.8207742461236148]

Etc. urandom()직접 사용하여 생성하는 임의의 바이트를 원하는 결과로 변환하는 자체 알고리즘을 발명해야합니다. 하지 마 ;-) SystemRandom당신을 위해 그것을합니다.

문서의이 부분을 참고하십시오.

class random.SystemRandom ([seed])

운영 체제에서 제공하는 소스에서 난수를 생성하기 위해 os.urandom () 함수를 사용하는 클래스입니다. 모든 시스템에서 사용할 수있는 것은 아닙니다. 소프트웨어 상태에 의존하지 않으며 시퀀스는 재현 할 수 없습니다. 따라서 seed () 및 jumpahead () 메서드는 효과가 없으며 무시됩니다. getstate () 및 setstate () 메서드는 호출되면 NotImplementedError를 발생시킵니다.


Python 3.6"운영 체제가 제공하는 가장 안전한 임의성 소스에 대한 액세스를 제공" 하는 새로운 secrets 모듈을 도입 합니다. 암호화 된 보안 번호를 생성하려면 secrets.randbelow().

secrets.randbelow(n)

0과 사이의 숫자를 반환합니다 n.


n-비트 난수 를 원한다면 Python 2.4 이상에서 내가 찾은 가장 쉬운 방법은

import random
random.SystemRandom().getrandbits(n)

SystemRandom사용하므로이 os.urandom()메서드의 결과는 시스템 urandom()구현 만큼만 ​​좋습니다 .


암호화 된 보안 의사 난수 정수를 생성하려면 다음 코드를 사용할 수 있습니다.

int(binascii.hexlify(os.urandom(n)),16)

n정수는 어디에 있고, 클수록 n생성되는 정수가 커집니다.

당신은 가져해야합니다 osbinascii첫 번째.

이 코드의 결과는 플랫폼에 따라 다를 수 있습니다.

참고 URL : https://stackoverflow.com/questions/20936993/how-can-i-create-a-random-number-that-is-cryptographically-secure-in-python

반응형