Để tạo số ngẫu nhiên an toàn về mặt mật mã học (cryptographically secure), ta có thể dùng module secrets trong Python. Module này hữu ích để tạo mật khẩu an toàn, xác thực tài khoản, token bảo mật hoặc các bí mật liên quan khác.
Để dùng các lớp và module của secrets, nên nhập module đó vào mã:
import secrets
Số ngẫu nhiên (Random Numbers)
Module secrets dùng để truy cập nguồn ngẫu nhiên an toàn (secure source of randomness). Nguồn này do hệ điều hành cung cấp.
Các lớp và hàm liên quan đến số ngẫu nhiên của module secrets:
Lớp secrets.SystemRandom
Lớp tạo số ngẫu nhiên, sử dụng các nguồn chất lượng cao nhất. Các nguồn này do hệ điều hành cung cấp.
Phương thức secrets.choice(sequence)
Chọn một phần tử từ sequence (chuỗi/tuple/list) không rỗng một cách ngẫu nhiên.
Phương thức secrets.randbelow(n)
Chọn một giá trị nguyên từ khoảng 0 đến n (không bao gồm n).
Phương thức secrets.randbits(k)
Trả về một số nguyên với k bit ngẫu nhiên.
Tạo Token (Generating Tokens)
Module secrets cũng có thể tạo các token an toàn. Loại token này hữu ích để tạo mật khẩu đặt lại (password resets), URL phức tạp, v.v.
Một số phương thức liên quan đến tạo token:
Phương thức secrets.token_bytes([nbytes=None])
Trả về chuỗi byte ngẫu nhiên với nbytes để tạo token an toàn. Khi nbytes không cho, dùng giá trị mặc định.
Phương thức secrets.token_hex([nbytes=None])
Trả về chuỗi văn bản ngẫu nhiên dạng hexadecimal. Chuỗi trả về có nbytes byte ngẫu nhiên. Mỗi ký tự chuyển thành 2 chữ số hex. Khi nbytes không cho, dùng giá trị mặc định.
Phương thức secrets.token_urlsafe([nbytes=None])
Trả về chuỗi văn bản ngẫu nhiên URL-Safe (an toàn cho URL). Văn bản về cơ bản là Base64 encoded. Trung bình mỗi byte cho ra 1.3 ký tự (xấp xỉ).
Mã ví dụ
import secrets
my_sequence = ['K','?','D',':','o','5','t','l','Y','0']
rand_pass = ''
for i in range(15):
rand_char = secrets.choice(my_sequence)
rand_pass += rand_char
print("Mật khẩu ngẫu nhiên là: " + rand_pass)
my_tok1 = secrets.token_hex(10) # Tạo HEX token độ dài 10
my_tok2 = secrets.token_hex(5) # Tạo HEX token độ dài 5
print("Token đầu tiên: " + my_tok1)
print("Token thứ hai: " + my_tok2)
Kết quả
Mật khẩu ngẫu nhiên là: YK0l:YD??lKKY?o Token đầu tiên: f3e68646dcf1082e1038 Token thứ hai: e4ae3c2384