secrets --- Tạo số ngẫu nhiên an toàn để quản lý bí mật

Added in version 3.6.

Source code: Lib/secrets.py


Mô-đun secrets đượ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à các bí mật liên quan.

Đặc biệt, nên sử dụng secrets thay vì trình tạo số giả ngẫu nhiên mặc định trong mô-đun random, được thiết kế để lập mô hình và mô phỏng, không phải để bảo mật hoặc mã hóa.

Xem thêm

PEP 506

Số ngẫu nhiên

Mô-đun secrets 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.

class secrets.SystemRandom

Một lớp để tạo số ngẫu nhiên bằng cách sử dụng các nguồn chất lượng cao nhất do hệ điều hành cung cấp. Xem random.SystemRandom để biết thêm chi tiết.

secrets.choice(seq)

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

secrets.randbelow(exclusive_upper_bound)

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

secrets.randbits(k)

Trả về một int không âm với các bit ngẫu nhiên k.

Tạo mã thông báo

Mô-đun secrets cung cấp các chức năng tạo mã thông báo an toàn, phù hợp cho các ứng dụng như đặt lại mật khẩu, URL khó đoán, v.v.

secrets.token_bytes(nbytes=None)

Trả về một chuỗi byte ngẫu nhiên chứa số byte nbytes.

Nếu nbytes không được chỉ định hoặc None, DEFAULT_ENTROPY sẽ được sử dụng thay thế.

>>> token_byte(16)
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
secrets.token_hex(nbytes=None)

Trả về một chuỗi văn bản ngẫu nhiên ở dạng thập lục phân. Chuỗi có các byte ngẫu nhiên nbytes, mỗi byte được chuyển đổi thành hai chữ số hex.

Nếu nbytes không được chỉ định hoặc None, DEFAULT_ENTROPY sẽ được sử dụng thay thế.

>>> token_hex(16)
'f9bf78b9a18ce6d46a0cd2b0b86df9da'
secrets.token_urlsafe(nbytes=None)

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, do đó, trung bình mỗi byte tạo ra khoảng 1,3 ký tự.

Nếu nbytes không được chỉ định hoặc None, DEFAULT_ENTROPY sẽ được sử dụng thay thế.

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

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

Để an toàn trước brute-force attacks, mã thông báo cần phải có đủ tính 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 ngày càng mạnh hơn và có thể đưa ra nhiều dự đoán hơn trong thời gian ngắn hơn. Tính đến năm 2015, người ta tin rằng 32 byte (256 bit) ngẫu nhiên là đủ cho trường hợp sử dụng điển hình dự kiến ​​cho mô-đun secrets.

Đối với những người muốn quản lý độ dài mã thông báo của riêng mình, 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 đối số int cho các hàm token_* khác nhau. Đối số đó được lấy là số byte ngẫu nhiên sẽ sử dụng.

Ngược lại, nếu không có đối số nào được cung cấp hoặc nếu đối số là None thì các hàm token_* sẽ sử dụng DEFAULT_ENTROPY thay thế.

secrets.DEFAULT_ENTROPY

Số byte ngẫu nhiên mặc định được sử dụng bởi các hàm token_*.

Giá trị chính xác có thể thay đổi bất cứ lúc nào, kể cả trong quá trình bảo trì.

Các chức năng khác

secrets.compare_digest(a, b)

Trả về True nếu các chuỗi hoặc bytes-like objects ab bằng nhau, nếu không thì False, sử dụng "so sánh thời gian không đổi" để giảm nguy cơ timing attacks. Xem hmac.compare_digest() để biết thêm chi tiết.

Bí quyết và cách thực hành tốt nhất

Phần này trình bày các công thức và cách thực hành tốt nhất để sử dụng secrets nhằm quản lý mức bảo mật cơ bản.

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

nhập chuỗi
nhập khẩu  mật
bảng chữ cái = string.ascii_letters + string.digits
mật khẩu = ''.join(secrets.choice(bảng chữ cái) cho tôi trong phạm vi (8))

Ghi chú

Các ứng dụng không nên store passwords in a recoverable format, dù là văn bản thuần túy hay được mã hóa. Chúng phải được muối và băm bằng cách sử dụng hàm băm một chiều (không thể đảo ngược) mạnh về mặt mật mã.

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

nhập chuỗi
nhập khẩu  mật
bảng chữ cái = string.ascii_letters + string.digits
trong khi Đúng:
    mật khẩu = ''.join(secrets.choice(alphabet) cho i trong phạm vi (10))
    if (any(c.islow() cho c trong mật khẩu)
             bất kỳ(c.isupper() cho c trong mật khẩu)
             sum(c.isdigit() cho c trong mật khẩu) >= 3):
        phá vỡ

Tạo một XKCD-style passphrase:

nhập khẩu  mật
# On hệ thống Linux tiêu chuẩn, sử dụng tệp từ điển tiện lợi.
Nền tảng # Other có thể cần cung cấp danh sách từ của riêng họ.
với open('/usr/share/dict/words')  f:
    từ = [word.strip() cho từ trong f]
    mật khẩu = ' '.join(secrets.choice(words) cho tôi trong phạm vi (4))

Tạo URL tạm thời khó đoán có 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:

nhập khẩu  mật
url = 'https://example.com/reset=' + secret.token_urlsafe()