파이썬에서 암호 학적으로 안전한 난수를 어떻게 만들 수 있습니까?
파이썬으로 프로젝트를 만들고 있는데 암호 학적으로 안전한 난수를 만들고 싶습니다. 어떻게 할 수 있습니까? 나는 온라인에서 정규 랜덤 화기에 의해 생성 된 숫자가 암호 학적으로 안전하지 않으며 함수 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생성되는 정수가 커집니다.
당신은 가져해야합니다 os및 binascii첫 번째.
이 코드의 결과는 플랫폼에 따라 다를 수 있습니다.
'Program Club' 카테고리의 다른 글
| iOS6 viewDidUnload 사용되지 않음 (0) | 2020.12.03 |
|---|---|
| git commit 중지됨-트리 빌드 오류 (0) | 2020.12.03 |
| NSURLSession : URL 요청에 대한 시간 초과를 늘리는 방법은 무엇입니까? (0) | 2020.12.03 |
| AngularJS 지시문에서 자식 요소 찾기 (0) | 2020.12.03 |
| Ubuntu를 사용하여 Docker 컨테이너 내에 pip 패키지를 설치할 수 없습니다. (0) | 2020.12.03 |