Hướng dẫn cryptographically secure pseudo random number generator python - Python trình tạo số ngẫu nhiên giả an toàn bằng mật mã

Vì bạn muốn tạo số nguyên trong một số phạm vi cụ thể, nên sử dụng lớp random.SystemRandom dễ dàng hơn rất nhiều. Tạo một thể hiện của lớp đó cung cấp cho bạn một đối tượng hỗ trợ tất cả các phương thức của mô -đun random, nhưng sử dụng

>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
0 trong các bìa. Ví dụ:

>>> 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]

V.v ... Sử dụng trực tiếp

>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
1, bạn phải phát minh ra các thuật toán của riêng mình để chuyển đổi các byte ngẫu nhiên mà nó tạo ra thành kết quả bạn muốn. Đừng làm điều đó ;-)
>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
2 làm điều đó cho bạn.

Lưu ý phần này của tài liệu:

lớp ngẫu nhiên.systemrandom ([hạt])

Lớp sử dụng hàm OS.urandom () để tạo số ngẫu nhiên từ các nguồn được cung cấp bởi hệ điều hành. Không có sẵn trên tất cả các hệ thống. Không dựa vào trạng thái phần mềm và các chuỗi không thể tái sản xuất. Theo đó, các phương pháp hạt giống () và jumpahead () không có tác dụng và bị bỏ qua. Các phương thức getState () và setState () tăng not kích thước nếu được gọi.

Một PRNG được cho là an toàn về mặt mật mã nếu, giả sử rằng nó hoạt động trên một khóa N bit không rõ đủ rộng, đầu ra của nó không thể phân biệt được với các bit ngẫu nhiên thống nhất.

Mới trong phiên bản 3.6. Lib/secrets.py


Mã nguồn: lib/secret.py

Mô -đun

>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
3 được sử dụng để tạo các số ngẫu nhiên mạnh về mặt mật mã phù hợp để quản lý dữ liệu như mật khẩu, xác thực tài khoản, mã thông báo bảo mật và bí mật liên quan.

Cụ thể, >>> token_bytes(16) b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b' 3 nên được sử dụng theo sở thích của trình tạo số giả ngẫu nhiên mặc định trong mô-đun >>> token_bytes(16) b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b' 5, được thiết kế để mô hình hóa và mô phỏng, không bảo mật hoặc mật mã.

Số ngẫu nhiên¶

Mô -đun
>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
3 cung cấp quyền truy cập vào nguồn ngẫu nhiên an toàn nhất mà hệ điều hành của bạn cung cấp.
secrets.SystemRandom

ClassSecrets.SystemRandom¶

Một lớp để tạo các số ngẫu nhiên bằng cách sử dụng các nguồn chất lượng cao nhất được cung cấp bởi hệ điều hành. Xem
>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
7 để biết thêm chi tiết.
choice(sequence)

Bí mật.Choice (trình tự) ¶

Trả về một phần tử được chọn ngẫu nhiên từ một chuỗi không trống.randbelow(n)

bí mật.randbelow (n) ¶

Trả về một int ngẫu nhiên trong phạm vi [0, n).randbits(k)

bí mật.randbits (k) ¶

Trả về một int với k bit ngẫu nhiên.

Tạo mã thông báo

Mô-đun
>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
3 cung cấp các chức năng để tạo mã thông báo bảo mật, phù hợp cho các ứng dụng như đặt lại mật khẩu, URL khó đoán và tương tự.
token_bytes([nbytes=None])

Bí mật.Token_Bytes ([nbytes = none]) ¶

>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'

Trả về một chuỗi byte ngẫu nhiên chứa số byte nbyte. Nếu NBytes là
>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
9 hoặc không được cung cấp, một mặc định hợp lý được sử dụng.
token_hex([nbytes=None])

bí mật.token_hex ([nbytes = none]) ¶

>>> token_hex(16)  
'f9bf78b9a18ce6d46a0cd2b0b86df9da'

Trả về một chuỗi văn bản ngẫu nhiên, trong thập lục phân. Chuỗi có nbytes byte ngẫu nhiên, mỗi byte được chuyển đổi thành hai chữ số hex. Nếu NBytes là
>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
9 hoặc không được cung cấp, một mặc định hợp lý được sử dụng.
token_urlsafe([nbytes=None])

Secrets.token_urlsafe ([nbytes = none]) ¶

>>> token_urlsafe(16)  
'Drmhze6EPcv0fN_81Bj-nA'

Trả về một chuỗi văn bản an toàn URL ngẫu nhiên, chứa các byte ngẫu nhiên NBytes. Văn bản được mã hóa base64, vì vậy trung bình mỗi byte dẫn đến khoảng 1,3 ký tự. Nếu NBytes là >>> token_bytes(16) b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b' 9 hoặc không được cung cấp, một mặc định hợp lý được sử dụng.

Mã thông báo nên sử dụng bao nhiêu byte? ¶

Để được an toàn trước các cuộc tấn công vũ phu, mã thông báo cần phải có đủ ngẫu nhiên. Thật không may, những gì được coi là đủ sẽ nhất thiết phải tăng lên khi máy tính trở nên mạnh mẽ hơn và có thể đoán được nhiều hơn trong một thời gian ngắn hơn. Kể từ năm 2015, người ta tin rằng 32 byte (256 bit) tính ngẫu nhiên là đủ cho trường hợp sử dụng điển hình dự kiến ​​cho mô-đun

>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
3.

Đối với những người muốn quản lý độ dài mã thông báo của riêng họ, bạn có thể chỉ định rõ ràng mức độ ngẫu nhiên được sử dụng cho mã thông báo bằng cách đưa ra một đối số

>>> token_hex(16)  
'f9bf78b9a18ce6d46a0cd2b0b86df9da'
3 cho các chức năng ____24 khác nhau. Đối số đó được coi là số byte của tính ngẫu nhiên để sử dụng.

Ghi chú

Mặc định đó có thể thay đổi bất cứ lúc nào, bao gồm cả trong các bản phát hành bảo trì.

Cac chưc năng khac¶

Secrets.compare_digest (a, b) ¶compare_digest(a, b)

Trả về

>>> token_hex(16)  
'f9bf78b9a18ce6d46a0cd2b0b86df9da'
7 Nếu chuỗi A và B bằng nhau, nếu không
>>> token_hex(16)  
'f9bf78b9a18ce6d46a0cd2b0b86df9da'
8, sử dụng một thời gian không đổi của người dùng so sánh với nhau để giảm nguy cơ tấn công thời gian. Xem
>>> token_hex(16)  
'f9bf78b9a18ce6d46a0cd2b0b86df9da'
9 để biết thêm chi tiết.

Công thức nấu ăn và thực hành tốt nhất Jo

Phần này cho thấy các công thức nấu ăn và thực tiễn tốt nhất để sử dụng

>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
3 để quản lý mức độ bảo mật cơ bản.

Tạo mật khẩu chữ và số tám ký tự:

import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))

Ghi chú

Các ứng dụng không nên lưu trữ mật khẩu ở định dạng có thể phục hồi, cho dù là văn bản thuần túy hoặc được mã hóa. Chúng nên được muối và băm bằng hàm băm một chiều mạnh về mặt mật mã (không thể đảo ngược).

Tạo mật khẩu chữ và số mười ký tự với ít nhất một ký tự viết thường, ít nhất một ký tự chữ hoa và ít nhất ba chữ số:

import string
import secrets
alphabet = string.ascii_letters + string.digits
while True:
    password = ''.join(secrets.choice(alphabet) for i in range(10))
    if (any(c.islower() for c in password)
            and any(c.isupper() for c in password)
            and sum(c.isdigit() for c in password) >= 3):
        break

Tạo cụm mật khẩu kiểu XKCD:

import secrets
# On standard Linux systems, use a convenient dictionary file.
# Other platforms may need to provide their own word-list.
with open('/usr/share/dict/words') as f:
    words = [word.strip() for word in f]
    password = ' '.join(secrets.choice(words) for i in range(4))

Tạo URL tạm thời khó đoán chứa mã thông báo bảo mật phù hợp cho các ứng dụng khôi phục mật khẩu:

import secrets
url = 'https://example.com/reset=' + secrets.token_urlsafe()

Làm thế nào để chúng ta tạo ra các số giả và số giả bảo mật bằng mã hóa?

Một PRNG được cho là an toàn về mặt mật mã nếu, giả sử rằng nó hoạt động trên một khóa N bit không rõ đủ rộng, đầu ra của nó không thể phân biệt được với các bit ngẫu nhiên thống nhất.
Một mật mã khối an toàn có thể được chuyển đổi thành CSPRNG bằng cách chạy nó ở chế độ truy cập. Điều này được thực hiện bằng cách chọn một khóa ngẫu nhiên và mã hóa 0, sau đó mã hóa 1, sau đó mã hóa 2, v.v. ....

Một hàm băm an toàn bằng mã hóa của một bộ đếm cũng có thể hoạt động như một CSPRNG tốt trong một số trường hợp ..

Khoa học dữ liệu thực tế sử dụng Python..
ngẫu nhiên.Seed () - Hàm này khởi tạo trình tạo số ngẫu nhiên.....
ngẫu nhiên.....
ngẫu nhiên.....
ngẫu nhiên.....
Random.random () - Hàm này ngẫu nhiên tạo số điểm nổi trong khoảng 0,0 đến 1.0 >>> ngẫu nhiên.random () 0.668544544081956 ..
ngẫu nhiên.....
ngẫu nhiên.....
random..

Random.random () - Hàm này ngẫu nhiên tạo số điểm nổi trong khoảng 0,0 đến 1.0 >>> ngẫu nhiên.random () 0.668544544081956 ..

Có phải ngẫu nhiên có an toàn về mặt mật mã không?a Random Number Generator (RNG) is a very important primitive for cryptographically secure applications [2].

Điều gì làm cho một trình tạo số ngẫu nhiên an toàn về mặt mật mã?

Một PRNG được cho là an toàn về mặt mật mã nếu, giả sử rằng nó hoạt động trên một khóa N bit không rõ đủ rộng, đầu ra của nó không thể phân biệt được với các bit ngẫu nhiên thống nhất.its output is computationally indistinguishable from uniformly random bits.