Công cụ tạo số ngẫu nhiên – Tức thì, miễn phí và hoàn toàn ngẫu nhiên
Bộ tạo số ngẫu nhiên là gì?
Máy tạo số ngẫu nhiên (RNG) là một hệ thống — tính toán, vật lý hoặc kết hợp — tạo ra một chuỗi số mà không thể dự đoán chính xác hơn là ngẫu nhiên. Mỗi giá trị đầu ra đều độc lập về mặt thống kê với các giá trị trước đó, và toàn bộ chuỗi không cho thấy bất kỳ quy luật nào có thể nhận biết được mà người quan sát có thể khai thác để đoán các đầu ra trong tương lai. Định nghĩa đó nghe có vẻ đơn giản, nhưng đạt được nó trong thực tế lại là một trong những vấn đề khó khăn nhất trong toán học ứng dụng và khoa học máy tính.
Cụm từ "máy phát số ngẫu nhiên" bao gồm hai khái niệm hoàn toàn khác nhau thường bị nhầm lẫn: máy phát số giả ngẫu nhiên (PRNG) , sử dụng các thuật toán xác định để tạo ra các chuỗi chỉ trông có vẻ ngẫu nhiên, và máy phát số ngẫu nhiên thực sự (TRNG) , thu thập entropy vật lý thực sự từ vũ trụ. Loại thứ ba, máy phát số giả ngẫu nhiên an toàn về mặt mật mã (CSPRNG) , nằm giữa hai loại trên — được triển khai theo cách xác định nhưng được thiết kế sao cho không có cuộc tấn công nào khả thi về mặt tính toán có thể phân biệt được đầu ra của chúng với tính ngẫu nhiên thực sự.
Tại sao bộ tạo số ngẫu nhiên lại quan trọng?
Máy tạo số ngẫu nhiên (RNG) là cơ sở hạ tầng chịu tải trọng trong khoa học, an ninh và phần mềm hàng ngày. Nếu không có tính ngẫu nhiên đáng tin cậy, mật mã hiện đại sẽ sụp đổ: mọi phiên TLS, mọi tin nhắn được mã hóa, mọi chữ ký số đều phụ thuộc vào các khóa bí mật phải không thể dự đoán được. Sòng bạc, xổ số và trò chơi trực tuyến phụ thuộc vào RNG để đảm bảo tính công bằng. Mô phỏng khoa học — từ mô hình khí hậu đến khám phá thuốc — sử dụng lấy mẫu ngẫu nhiên để xấp xỉ các giải pháp không thể giải quyết bằng phương pháp phân tích. Lấy mẫu thống kê, thử nghiệm A/B, tạo thế giới trò chơi theo quy trình và thậm chí cả việc khởi tạo trọng số mạng nơ-ron đều yêu cầu các số ngẫu nhiên chất lượng cao.
Hậu quả của việc sử dụng tính ngẫu nhiên không chính xác rất nghiêm trọng và đã được ghi nhận rõ ràng. Năm 2012, các nhà nghiên cứu phát hiện ra rằng hàng triệu khóa công khai RSA trên internet có chung các thừa số nguyên tố vì các thiết bị tạo ra chúng có đủ entropy khi khởi động. Kẻ tấn công nào phân tích được thừa số nguyên tố chung đó có thể khôi phục khóa riêng và giải mã tất cả các thông tin liên lạc. Năm 2010, máy chơi game Sony PlayStation 3 bị bẻ khóa vì thuật toán ECDSA của nó sử dụng lại cùng một giá trị nonce "ngẫu nhiên" cho mọi chữ ký — chỉ cần một giá trị lặp lại duy nhất là đủ để trích xuất khóa riêng bằng phương pháp đại số. Đây không phải là các trường hợp ngoại lệ; chúng là kết quả có thể dự đoán được khi coi tính ngẫu nhiên như một vấn đề đã được giải quyết.
Các lĩnh vực ứng dụng chính
- Mật mã học và bảo mật: Tạo khóa, vectơ khởi tạo, số ngẫu nhiên (nonce), muối (salt), mã thông báo phiên và số sê-ri chứng chỉ.
- Mô phỏng và lập mô hình: Phương pháp Monte Carlo, phương trình vi phân ngẫu nhiên, mô phỏng vật lý hạt, mô hình dịch tễ học.
- Trò chơi và cờ bạc: Xáo bài, tung xúc xắc, kết quả máy đánh bạc, tạo màn chơi ngẫu nhiên, bảng vật phẩm rơi ra.
- Thống kê và nghiên cứu: Lấy mẫu ngẫu nhiên, thử nghiệm đối chứng ngẫu nhiên, phương pháp bootstrapping, phân chia chéo để kiểm định.
- Hệ thống phân tán: Bầu chọn lãnh đạo, cân bằng tải với độ trễ ngẫu nhiên, lùi thời gian theo cấp số nhân với độ trễ ngẫu nhiên.
- Máy học: Khởi tạo trọng số, mặt nạ dropout, tăng cường dữ liệu, thuật toán gradient descent ngẫu nhiên.
Cách thức hoạt động của bộ tạo số giả ngẫu nhiên
Một bộ tạo số ngẫu nhiên giả (PRNG) bắt đầu với một hạt giống — một số đơn lẻ hoặc một khối dữ liệu nhỏ — và áp dụng một hàm toán học xác định lặp đi lặp lại để tạo ra một chuỗi dài các đầu ra. Với cùng một hạt giống, chuỗi này hoàn toàn có thể tái tạo được. Với một hạt giống khác, chuỗi này sẽ trông hoàn toàn khác. Chất lượng của một PRNG được đánh giá bằng mức độ nó vượt qua các bài kiểm tra thống kê về tính ngẫu nhiên và, đối với các ứng dụng bảo mật, liệu trạng thái bên trong của nó có thể được suy ra từ các đầu ra của nó hay không.
Bộ tạo đồng dư tuyến tính
Họ máy tạo số ngẫu nhiên giả (PRNG) lâu đời nhất và đơn giản nhất sử dụng công thức truy hồi X n+1 = (aX n + c) mod m , trong đó a, c và m là các hằng số được chọn cẩn thận. Hàm rand() của thư viện chuẩn C trong nhiều trình biên dịch là một máy tạo số ngẫu nhiên tuyến tính (LCG). LCG nhanh và dễ triển khai, nhưng chúng có những điểm yếu nghiêm trọng: các bit bậc thấp lặp lại với chu kỳ ngắn, chu kỳ của chuỗi đầy đủ tối đa là m, và trạng thái bên trong có thể dễ dàng khôi phục từ một vài đầu ra. Chúng có thể chấp nhận được đối với các mô phỏng đơn giản và trò chơi không yêu cầu bảo mật, và hoàn toàn không thể chấp nhận được đối với bất kỳ thứ gì liên quan đến mật mã.
Mersenne Twister
Thuật toán Mersenne Twister (MT19937), được Matsumoto và Nishimura công bố năm 1998, đã trở thành thuật toán tạo số ngẫu nhiên giả (PRNG) mặc định trong Python, Ruby, R, PHP và nhiều ngôn ngữ khác. Nó có chu kỳ 2¹⁹937 − 1 (cực kỳ lớn), vượt qua hầu hết các bài kiểm tra thống kê và chạy rất nhanh. Trạng thái bên trong của nó là 624 số nguyên 32 bit. Điểm yếu chí mạng: nếu kẻ tấn công quan sát được 624 đầu ra liên tiếp, chúng có thể tái tạo lại toàn bộ trạng thái bên trong và dự đoán mọi đầu ra trong tương lai. Do đó, Mersenne Twister hoàn toàn không phù hợp cho bất kỳ ứng dụng nào nhạy cảm về bảo mật, mặc dù nó bị lạm dụng rộng rãi trong vai trò đó.
Các thuật toán tạo số ngẫu nhiên hiện đại: Xoshiro, PCG và SFC
Các thuật toán tạo số ngẫu nhiên giả (PRNG) không dùng mật mã hiện nay được ưa chuộng bao gồm họ PCG (Permuted Congruential Generators), xoshiro256** và SFC64 . Các thuật toán này nhỏ hơn, nhanh hơn và có hiệu suất thống kê vượt trội hơn so với Mersenne Twister. Đặc biệt, PCG có hiệu suất tuyệt vời trên bộ kiểm thử TestU01 BigCrush — bộ kiểm thử thống kê tiêu chuẩn khắt khe nhất dành cho PRNG. NumPy đã chuyển thuật toán mặc định từ Mersenne Twister sang PCG64 trong phiên bản 1.17 chính vì lý do này.
Cách thức hoạt động của bộ tạo số ngẫu nhiên giả an toàn về mặt mật mã
Một thuật toán tạo số ngẫu nhiên an toàn về mặt an ninh mạng (CSPRNG) phải thỏa mãn hai thuộc tính vượt ra ngoài tính ngẫu nhiên thống kê thông thường. Thứ nhất, tính không thể dự đoán được bit tiếp theo : với tất cả các đầu ra trước đó, không có thuật toán thời gian đa thức nào có thể dự đoán bit tiếp theo với xác suất lớn hơn 50% một cách đáng kể. Thứ hai, khả năng chống lại sự xâm phạm trạng thái : nếu kẻ tấn công biết được trạng thái nội bộ hiện tại, chúng không thể khôi phục lại các đầu ra trong quá khứ (điều này được gọi là tính bảo mật ngược hoặc khả năng chống lại việc truy hồi).
Các hệ điều hành hiện đại cung cấp CSPRNG như một dịch vụ cốt lõi. Linux cung cấp /dev/urandom và lệnh gọi hệ thống getrandom() , cả hai đều lấy từ một nhóm entropy của nhân hệ điều hành được gieo mầm bởi các sự kiện phần cứng. Windows cung cấp BCryptGenRandom() . macOS và iOS sử dụng arc4random_buf() , từ macOS 10.12 trở đi được hỗ trợ bởi ChaCha20. Các cấu trúc cơ bản được sử dụng trong các CSPRNG thực tế bao gồm Hash_DRBG , HMAC_DRBG và CTR_DRBG (tất cả đều được tiêu chuẩn hóa trong NIST SP 800-90A), cũng như các bộ tạo dựa trên ChaCha20 được sử dụng bởi các hệ điều hành BSD và Linux hiện đại.
Cách thức hoạt động của một bộ tạo số ngẫu nhiên thực sự
TRNG (Bộ tạo số ngẫu nhiên thực sự) trích xuất tính ngẫu nhiên từ các quá trình vật lý thực sự không thể dự đoán được — hoặc vì chúng về cơ bản là cơ học lượng tử hoặc vì chúng liên quan đến các hệ thống cổ điển hỗn loạn nhạy cảm với các điều kiện ban đầu không thể đo lường được.
Các nguồn entropy vật lý phổ biến
- Nhiễu nhiệt (nhiễu Johnson-Nyquist): Chuyển động ngẫu nhiên của các electron trong điện trở tạo ra sự dao động điện áp có thể được lấy mẫu và số hóa.
- Nhiễu photon: Sự xuất hiện ngẫu nhiên, rời rạc của các photon hoặc electron tại bộ детектор tạo ra một tín hiệu ngẫu nhiên có thể đo được.
- Phân rã phóng xạ: Thời điểm xảy ra các sự kiện phân rã từ một nguồn phóng xạ hoàn toàn ngẫu nhiên theo cơ chế lượng tử. RANDOM.ORG sử dụng nhiễu sóng radio trong khí quyển, vốn cũng không thể dự đoán được.
- Các nguồn quang học lượng tử: Thời gian đến của photon, sự dao động chân không được đo bằng phương pháp phát hiện homodyne, và các lựa chọn đường đi của bộ tách chùm tia đều là những nguồn tạo nên tính ngẫu nhiên lượng tử đã được chứng nhận.
- Độ nhiễu phần cứng trên các thiết bị tiêu dùng: Các CPU hiện đại bao gồm các lệnh tạo số ngẫu nhiên phần cứng chuyên dụng. RDRAND của Intel sử dụng nguồn nhiễu nhiệt trên chip được xử lý thông qua AES-CBC-MAC. Phiên bản tương đương của AMD hoạt động tương tự. TrustZone của ARM bao gồm một nguồn nhiễu phần cứng mà hệ điều hành có thể truy cập.
- Các nhóm entropy của hệ điều hành: Linux thu thập entropy từ thời gian ngắt, độ trễ I/O đĩa, thời gian đến của gói mạng và các lệnh tạo số ngẫu nhiên phần cứng, trộn chúng thông qua một cấu trúc mật mã để tạo ra nhóm entropy của nhân hệ điều hành.
Vấn đề điều kiện
Nhiễu vật lý thô hiếm khi được phân bố đồng đều. Một nguồn nhiễu nhiệt có thể tạo ra nhiều bit 0 hơn bit 1 do sự bất đối xứng của mạch. Do đó, một TRNG (Bộ tạo số ngẫu nhiên thực sự) bao gồm một bước xử lý – thường là hàm băm mật mã hoặc hàm trích xuất – để nén các mẫu thô thành một đầu ra ngắn hơn, được chứng minh là đồng đều. Tỷ lệ giữa số bit thô được tiêu thụ và số bit đầu ra được tạo ra được gọi là tỷ lệ entropy tối thiểu , và một TRNG được thiết kế tốt sẽ đặc trưng hóa tỷ lệ này một cách cẩn thận. Tiêu chuẩn NIST SP 800-90B định nghĩa các yêu cầu kiểm tra và xác thực đối với các nguồn entropy được sử dụng trong các hệ thống liên bang.
So sánh PRNG, CSPRNG và TRNG
| Tài sản | PRNG | CSPRNG | TRNG |
|---|---|---|---|
| Xác định | Đúng | Có (sau khi gieo hạt) | KHÔNG |
| Có thể nhân giống từ hạt giống | Đúng | Đúng | KHÔNG |
| Vượt qua các bài kiểm tra thống kê | Thường xuyên | Đúng | Có (sau khi điều chỉnh) |
| Bảo vệ chống lại dự đoán | KHÔNG | Đúng | Đúng |
| Tốc độ | Rất nhanh | Nhanh | Chậm (do giới hạn phần cứng) |
| Yêu cầu entropy phần cứng | Chỉ dùng để gieo hạt | Chỉ dùng để gieo hạt | Luôn luôn |
| Các trường hợp sử dụng điển hình | Mô phỏng, trò chơi, lấy mẫu | Tạo khóa, mã thông báo, mật mã | Khóa bảo mật cao, quy định về cờ bạc, nghiên cứu |
Định nghĩa thống kê về tính ngẫu nhiên
Tính ngẫu nhiên không phải là một thuộc tính nhị phân — nó tồn tại trên một phổ rộng, và tiêu chuẩn phù hợp hoàn toàn phụ thuộc vào ứng dụng. Một chuỗi được coi là ngẫu nhiên cho một mục đích nhất định nếu không có thử nghiệm nào liên quan đến mục đích đó có thể phân biệt nó với một chuỗi ngẫu nhiên lý tưởng về mặt lý thuyết. NIST công bố một bộ kiểm thử thống kê (SP 800-22) bao gồm mười lăm bài kiểm tra, trong đó có phân tích tần số, kiểm thử chuỗi, phân tích phổ và độ phức tạp tuyến tính. Bộ kiểm thử BigCrush của thư viện TestU01, được phát triển tại Đại học Montréal, thậm chí còn khắt khe hơn, áp dụng 106 bài kiểm tra khác nhau. Một trình tạo không vượt qua được BigCrush không phù hợp cho công việc mô phỏng nghiêm túc, bất kể tốc độ chạy của nó nhanh đến mức nào.
Cần phải làm rõ những gì mà tính ngẫu nhiên không có nghĩa. Một dãy số như 1, 2, 3, 4, 5 không phải là ngẫu nhiên mặc dù mỗi số riêng lẻ đều có khả năng xuất hiện như nhau — mô hình này có thể dự đoán được. Ngược lại, một dãy số có thể trông giống như được tạo thành do ngẫu nhiên (ba mặt ngửa liên tiếp từ một đồng xu công bằng) mà không nhất thiết là không ngẫu nhiên. Tính ngẫu nhiên là một thuộc tính của quá trình tạo ra nó, chứ không phải của bất kỳ dãy số đầu ra cụ thể nào được xem xét một cách riêng lẻ.
Cách thức hoạt động của bộ tạo số ngẫu nhiên: Cơ chế cốt lõi và các chiến thuật thực tiễn
Các bộ tạo số ngẫu nhiên được chia thành hai loại cơ bản — bộ tạo số giả ngẫu nhiên (PRNG) sử dụng các thuật toán xác định được gieo hạt với một giá trị ban đầu, và bộ tạo số ngẫu nhiên thực sự (TRNG) lấy entropy từ các hiện tượng vật lý. Việc lựa chọn đúng loại, gieo hạt chính xác và áp dụng nó vào trường hợp sử dụng cụ thể của bạn sẽ quyết định liệu kết quả của bạn có chính xác về mặt thống kê, an toàn về mặt mật mã hay dễ đoán một cách nguy hiểm.
Chiến lược từng bước để lựa chọn và sử dụng bộ tạo số ngẫu nhiên (RNG).
Trước khi tạo ra bất kỳ số ngẫu nhiên nào, bạn cần phải lựa chọn bộ tạo số phù hợp với nhiệm vụ. Sử dụng bộ tạo số ngẫu nhiên giả nhanh để tạo khóa mã hóa là một trong những sai lầm nghiêm trọng nhất trong bảo mật phần mềm. Tương tự, việc sử dụng bộ tạo số ngẫu nhiên phần cứng chậm cho mô phỏng Monte Carlo với hàng tỷ lần lặp sẽ lãng phí tài nguyên một cách không cần thiết. Các bước sau đây sẽ hướng dẫn bạn qua quá trình ra quyết định từ những nguyên tắc cơ bản.
Bước 1: Xác định các yêu cầu về tính ngẫu nhiên
Hãy tự hỏi ba câu hỏi này trước khi sử dụng bất kỳ công cụ hoặc thư viện nào:
- Khả năng dự đoán có quan trọng không? Nếu việc kẻ thù đoán được các con số của bạn gây ra thiệt hại — trong mật mã học, cờ bạc, xổ số hoặc mã bảo mật — bạn cần tính ngẫu nhiên ở cấp độ mật mã. Nếu bạn đang chạy mô phỏng vật lý hoặc xáo trộn danh sách phát nhạc, một bộ tạo số ngẫu nhiên giả chất lượng cao là đủ.
- Bạn cần bao nhiêu số? Một số máy phát điện có chu kỳ hữu hạn. Máy phát điện Mersenne Twister, được sử dụng rộng rãi trong mô-đun
randomcủa Python và nhiều ngôn ngữ khác, có chu kỳ là 2¹⁹937 − 1, một con số khổng lồ đối với hầu hết các mục đích nhưng vẫn hữu hạn và có tính xác định. - Bạn có cần khả năng tái tạo kết quả không? Các thí nghiệm khoa học và việc tạo trò chơi theo quy trình thường yêu cầu tái tạo chính xác cùng một chuỗi. Một bộ tạo số ngẫu nhiên giả có hạt giống (seeded PRNG) cung cấp điều đó. Một bộ tạo số ngẫu nhiên thực (TRNG) thì không.
Bước 2: Chọn loại máy phát điện phù hợp
| Trường hợp sử dụng | Máy phát điện được đề xuất | Ví dụ |
|---|---|---|
| Khóa mã hóa, mật khẩu, mã thông báo | CSPRNG (Bộ tạo số ngẫu nhiên an toàn về mặt mật mã) | mô-đun secrets (Python), crypto.randomBytes (Node.js), /dev/urandom (Linux) |
| Mô phỏng, thống kê, máy học | PRNG chất lượng cao | Mersenne Twister, PCG64, xoshiro256** |
| Xổ số, các kỳ quay số có thể kiểm toán | TRNG hoặc RNG phần cứng được chứng nhận | RANDOM.ORG, mô-đun bảo mật phần cứng (HSM) |
| Trò chơi, tạo lập theo quy trình | PRNG được gieo hạt | Mersenne Twister, LCG với các hằng số tốt |
| Hệ thống nhúng thời gian thực | Bộ tạo số ngẫu nhiên phần cứng tích hợp trên chip | Intel RDRAND, ARM TrueRNG |
Bước 3: Khởi tạo máy phát điện đúng cách
Hạt giống là điểm yếu duy nhất đối với hầu hết các hệ thống tạo số ngẫu nhiên giả (PRNG). Một hạt giống yếu hoặc dễ đoán sẽ làm sụp đổ toàn bộ mô hình bảo mật của PRNG, bất kể thuật toán của nó tinh vi đến mức nào.
- Hãy sử dụng các hạt giống có độ nhiễu cao. Các nhóm hạt giống ngẫu nhiên của hệ điều hành (
/dev/urandomtrên Unix,CryptGenRandomtrên Windows) kết hợp các sự kiện phần cứng — thời gian nhấn bàn phím, ngắt đĩa, thời gian đến của gói mạng — để tạo ra các hạt giống mà hầu như không thể dự đoán được. - Không bao giờ nên chỉ sử dụng đồng hồ hệ thống để tạo mã hạt giống. Kẻ tấn công biết thời gian gần đúng chương trình của bạn bắt đầu có thể tấn công vét cạn để tìm ra mã hạt giống dựa trên dấu thời gian chỉ trong vài giây. Lỗ hổng này đã bị khai thác trong các cuộc tấn công thực tế vào các trang web chơi poker trực tuyến và hệ thống xổ số.
- Không bao giờ được mã hóa cứng các seed trong mã nguồn sản phẩm. Một seed cố định sẽ tạo ra cùng một chuỗi mỗi lần chạy. Điều này hữu ích cho việc kiểm thử nhưng lại gây ra hậu quả nghiêm trọng về bảo mật.
- Hãy định kỳ bổ sung dữ liệu mới cho các ứng dụng chạy dài hạn. Nếu ứng dụng của bạn chạy trong nhiều ngày hoặc nhiều tuần, việc định kỳ bổ sung dữ liệu mới sẽ ngăn bộ tạo rơi vào trạng thái có thể dự đoán được.
Bước 4: Áp dụng công cụ tạo mã cho nhiệm vụ cụ thể của bạn
Việc tạo ra một số ngẫu nhiên thô hiếm khi là mục tiêu cuối cùng. Ứng dụng thực tế — lấy mẫu, xáo trộn, ánh xạ phạm vi — cũng tiềm ẩn những lỗi riêng.
Tạo các số trong một phạm vi nhất định
Cách tiếp cận đơn giản bằng cách sử dụng toán tử modulo ( rand() % N ) sẽ gây ra sai lệch modulo. Nếu phạm vi đầu ra của máy phát không chia hết cho N, một số giá trị sẽ xuất hiện thường xuyên hơn các giá trị khác. Ví dụ, nếu máy phát của bạn tạo ra các giá trị từ 0 đến 32767 và bạn muốn các số từ 0 đến 99, các giá trị từ 0 đến 67 sẽ xuất hiện thường xuyên hơn một chút so với các giá trị từ 68 đến 99 vì 32768 không chia hết cho 100.
- Sử dụng phương pháp lấy mẫu loại bỏ. Loại bỏ các giá trị nằm ở phần đuôi bị lệch và vẽ lại. Hầu hết các thư viện chuẩn được triển khai tốt đều thực hiện điều này tự động.
- Hãy sử dụng các hàm phạm vi tích hợp sẵn. Các hàm
random.randint(a, b)của Python,ThreadLocalRandom.nextInt(origin, bound)của Java và các hàm tương tự sẽ xử lý độ lệch bên trong. - Để sử dụng cho mục đích mã hóa, hãy sử dụng mô-đun
secretstrong Python hoặc tương đương, mô-đun này mặc định thực hiện việc lựa chọn phạm vi không thiên vị.
Xáo trộn danh sách một cách công bằng
Thuật toán xáo trộn Fisher-Yates (còn gọi là thuật toán xáo trộn Knuth) là thuật toán duy nhất chính xác để tạo ra một hoán vị ngẫu nhiên đồng nhất. Nó hoạt động bằng cách lặp từ phần tử cuối cùng đến phần tử đầu tiên, hoán đổi mỗi phần tử với một phần tử được chọn ngẫu nhiên tại hoặc trước vị trí hiện tại của nó.
- Bắt đầu từ chỉ số cuối cùng i = n−1.
- Chọn ngẫu nhiên một chỉ số j sao cho 0 ≤ j ≤ i.
- Hoán đổi vị trí các phần tử ở vị trí i và j .
- Giảm i đi và lặp lại cho đến khi i = 0.
Phương án đơn giản hơn — chọn ngẫu nhiên vị trí cho từng phần tử một cách độc lập — không tạo ra sự phân bố đồng đều. Một số hoán vị xuất hiện thường xuyên hơn những hoán vị khác, đây là một điểm yếu có thể đo lường và khai thác được trong các trò chơi bài và xổ số.
Lấy mẫu không thay thế
Khi bạn cần k giá trị duy nhất từ một tập hợp gồm n giá trị, việc lấy mẫu và loại bỏ các giá trị trùng lặp là không hiệu quả. Hãy sử dụng phương pháp lấy mẫu theo kiểu vòng lặp random.sample(population, k) của Python thực hiện điều này một cách chính xác và hiệu quả.
Bước 5: Kiểm tra chất lượng đầu ra của máy phát điện
Ngay cả một hệ thống tạo số ngẫu nhiên (RNG) được triển khai đúng cách cũng có thể gặp lỗi trong các ứng dụng cụ thể nếu các thuộc tính thống kê của nó không phù hợp với yêu cầu của ứng dụng. Các bộ kiểm thử tiêu chuẩn thường phát hiện ra hầu hết các lỗi.
- TestU01 (BigCrush): Bộ kiểm thử thống kê nghiêm ngặt nhất dành cho các bộ tạo số ngẫu nhiên giả. Nó áp dụng hàng trăm bài kiểm tra và có khả năng phát hiện các mối tương quan tinh tế mà các bài kiểm tra đơn giản hơn bỏ sót. Nhiều bộ tạo số ngẫu nhiên cũ hơn, bao gồm một số biến thể LCG, không vượt qua được BigCrush.
- Diehard / Dieharder: Một bộ kiểm định thống kê được sử dụng rộng rãi, ban đầu được phát triển bởi George Marsaglia. Dieharder là phiên bản cập nhật và mở rộng.
- NIST SP 800-22: Bộ kiểm thử tiêu chuẩn dành cho các bộ tạo số ngẫu nhiên mật mã, cần thiết cho chứng nhận FIPS. Nó kiểm tra tần số, chuỗi, đặc tính phổ và nhiều hơn nữa.
- PractRand: Đặc biệt hiệu quả trong việc phát hiện lỗi ở các máy phát điện có chu kỳ ngắn hoặc khả năng phân tán kém.
Let AutoSEO write & rank this for you — on autopilot
Enter your site: we scan it, build a keyword plan, and publish ranking-ready articles for Google and AI answers. Start for $1.
Những lỗi thường gặp cần tránh
Hầu hết các lỗi tạo số ngẫu nhiên (RNG) trong hệ thống sản xuất đều xuất phát từ một số ít lỗi lặp đi lặp lại. Việc nhận biết chúng trước sẽ giúp ngăn ngừa phần lớn các lỗ hổng bảo mật và sai sót thống kê trong thực tế.
Sai lầm 1: Sử dụng Math.random() hoặc hàm tương đương để đảm bảo an ninh.
Math.random() của JavaScript, mô-đun random của Python (không phải secrets ), rand() của PHP và các hàm đa năng tương tự đều được ghi rõ là không phù hợp cho mục đích mã hóa. Chúng ưu tiên tốc độ hơn tính không thể dự đoán được. Kẻ tấn công quan sát đủ giá trị đầu ra có thể tái tạo trạng thái bên trong của thuật toán Mersenne Twister chỉ với 624 đầu ra 32 bit liên tiếp, sau đó dự đoán tất cả các giá trị trong tương lai. Cuộc tấn công này đã được chứng minh trên các nền tảng cá cược trực tuyến.
Lỗi 2: Sử dụng lại cùng một mã hạt giống trong nhiều phiên làm việc.
Nếu một ứng dụng web sử dụng ID tiến trình của máy chủ hoặc dấu thời gian khởi động làm nguồn ban đầu cho trình tạo mã thông báo phiên, thì mọi mã thông báo phiên được tạo trong cùng một giây đều dùng chung một nguồn ban đầu. Điều này không chỉ là lý thuyết — mà còn là nguyên nhân gốc rễ của các lỗ hổng chiếm đoạt phiên trong các framework đang hoạt động.
Lỗi 3: Tạo ra quá ít bit so với lượng entropy cần thiết
Mã PIN 6 chữ số có khoảng 20 bit entropy. UUID v4 có 122 bit. Khóa mã hóa cần ít nhất 128 bit cho mã hóa đối xứng và 256 bit cho bảo mật lâu dài chống lại phần cứng trong tương lai. Việc tạo ra các mã thông báo ngắn và cho rằng chúng không thể đoán được là một lỗi cấu trúc, chứ không phải là một chi tiết triển khai.
Sai lầm 4: Bỏ qua hành vi đặc thù của nền tảng
- Trên một số nhân Linux cũ hơn, việc đọc từ
/dev/randomsẽ bị chặn khi nguồn entropy cạn kiệt./dev/urandomthì không bị chặn và an toàn cho hầu hết các mục đích mã hóa sau khi khởi động ban đầu. - Máy ảo có thể có độ nhiễu loạn thấp hơn khi khởi động vì chúng thiếu sự đa dạng về sự kiện phần cứng như máy vật lý. Việc gieo hạt ngay sau khi khởi tạo máy ảo có thể tạo ra các khóa yếu.
- Một số hệ thống nhúng hoàn toàn không có bộ tạo số ngẫu nhiên phần cứng. Các nhà phát triển đôi khi phải sử dụng các nguồn tạo số ngẫu nhiên chỉ dựa trên phần mềm, vốn yếu hơn nhiều so với vẻ ngoài của chúng.
Sai lầm 5: Coi kết quả đã xáo trộn là ngẫu nhiên đồng nhất mà không kiểm chứng.
Nếu bộ tạo số ngẫu nhiên (RNG) cơ bản có chu kỳ ngắn hơn số lượng hoán vị có thể có của tập dữ liệu, thì không phải tất cả các hoán vị đều có thể được tạo ra. Một bộ bài 52 lá tiêu chuẩn có 52! ≈ 2²²⁶ cách sắp xếp khác nhau. Một bộ tạo với hạt giống 32 bit chỉ có thể tạo ra tối đa 2³² ≈ 4 tỷ chuỗi khác nhau — một phần cực kỳ nhỏ so với tất cả các cách xáo bài có thể. Đối với các trò chơi bài có tiền cược thực, đây là một điểm yếu cụ thể và có thể bị khai thác.
Sai lầm 6: Nhầm lẫn giữa độc lập và tính đồng nhất
Một dãy số có thể được phân bố đều — mỗi giá trị xuất hiện với tần suất bằng nhau — trong khi vẫn có mối tương quan cao giữa các lần rút thăm liên tiếp. Nhiều dãy số LCG chất lượng thấp vượt qua các bài kiểm tra tần suất nhưng không vượt qua các bài kiểm tra phổ vì các giá trị liên tiếp của chúng nằm trên một số ít siêu mặt phẳng trong không gian đa chiều. Hiện tượng này, được gọi là cấu trúc mạng lưới của dãy số LCG, khiến chúng không phù hợp cho việc tích phân Monte Carlo đa chiều.
Các chiến thuật thực tiễn theo ngôn ngữ lập trình
Python
- Sử dụng
secrets.token_bytes(n),secrets.token_hex(n)hoặcsecrets.randbelow(n)cho bất kỳ giá trị nhạy cảm về bảo mật nào. - Hãy sử dụng
random.SystemRandom()như một sự thay thế trực tiếp chorandom.Random()khi bạn cần giao diện chuẩn được hỗ trợ bởi entropy của hệ điều hành. - Đối với các phép tính số học, hãy sử dụng
numpy.random.default_rng(), hàm này mặc định sử dụng bộ tạo số ngẫu nhiên PCG64, một bộ tạo số ngẫu nhiên giả chất lượng cao hiện đại đã vượt qua bài kiểm tra BigCrush.
JavaScript / Node.js
- Hãy sử dụng
crypto.randomBytes(n)hoặccrypto.getRandomValues()(API mã hóa web trong trình duyệt) cho tất cả các mục đích bảo mật. - Tuyệt đối không sử dụng
Math.random()cho mã thông báo, ID hoặc bất cứ thứ gì mà kẻ thù có thể cố gắng dự đoán.
Java
- Hãy sử dụng
java.security.SecureRandomcho mục đích mã hóa. Khởi tạo nó một lần và tái sử dụng thể hiện đó — việc khởi tạo tốn kém. - Hãy sử dụng
ThreadLocalRandomcho các ứng dụng không liên quan đến bảo mật với thông lượng cao trong môi trường đa luồng. - Nên tránh sử dụng
java.util.Randomtrong các ngữ cảnh đồng thời — nó sử dụng một hạt giống dùng chung có thể gây ra xung đột khi có sự tranh chấp.
C / C++
- Tránh sử dụng
rand()từ thư viện chuẩn C. Hàm này phụ thuộc vào trình biên dịch, thường là một LCG yếu và không an toàn cho đa luồng. - Sử dụng
std::mt19937từ<random>được gieo hạt bằngstd::random_devicecho mục đích sử dụng chung. - Để sử dụng cho mục đích mã hóa, hãy gọi trực tiếp các hàm cơ bản của hệ điều hành:
getrandom()trên Linux,BCryptGenRandomtrên Windows.
Công cụ, phần mềm và tự động hóa tạo số ngẫu nhiên
Các công cụ tạo số ngẫu nhiên được sử dụng rộng rãi nhất bao gồm các dịch vụ dựa trên trình duyệt như RANDOM.ORG (lấy entropy từ nhiễu khí quyển) cho đến các thư viện mật mã được tích hợp sẵn trong mọi ngôn ngữ lập trình chính. Việc lựa chọn công cụ phù hợp phụ thuộc vào trường hợp sử dụng của bạn: mô phỏng thống kê cần tốc độ và chất lượng thống kê, ứng dụng bảo mật cần tính không thể dự đoán được bằng mật mã, và các thí nghiệm vật lý cần tính ngẫu nhiên thực sự của phần cứng.
Công cụ RNG dựa trên trình duyệt và trực tuyến
Các công cụ tạo số ngẫu nhiên trực tuyến không cần cài đặt và phù hợp cho việc quay số ngẫu nhiên, trình diễn trong lớp học và đưa ra quyết định nhanh chóng. Các lựa chọn uy tín nhất bao gồm:
- RANDOM.ORG — Sử dụng nhiễu sóng radio trong khí quyển làm nguồn entropy thực sự. Cung cấp các bộ tạo số nguyên, bộ xáo trộn chuỗi, bộ tạo số Gaussian và API dựa trên hạn mức để truy cập lập trình.
- Bộ tạo số ngẫu nhiên tích hợp sẵn của Google — Tìm kiếm "số ngẫu nhiên giữa 1 và 100" trên Google sẽ trả về kết quả ngay lập tức bằng cách sử dụng bộ tạo số ngẫu nhiên giả (PRNG) được gieo mầm từ entropy của hệ thống.
- Công cụ chọn số ngẫu nhiên dạng bánh xe — Giao diện trực quan dạng bánh xe quay sử dụng JavaScript Math.random() bên trong, phù hợp cho việc lựa chọn trong lớp học hoặc các chương trình trò chơi truyền hình.
- Bốc thăm dò ý kiến và quay số ngẫu nhiên — Kết hợp danh sách người tham gia với lựa chọn ngẫu nhiên để phân công nhóm, bốc thăm trúng thưởng và đưa ra quyết định tập thể.
Một hạn chế đáng kể của hầu hết các công cụ trên trình duyệt là chúng dựa vào Math.random() của JavaScript, vốn là một bộ tạo số ngẫu nhiên giả (PRNG) và không an toàn về mặt mật mã. Đối với bất kỳ vấn đề nào liên quan đến bảo mật, mã thông báo hoặc các quyết định tài chính, hãy sử dụng một công cụ hoặc thư viện mật mã chuyên dụng.
Thư viện ngôn ngữ lập trình và các hàm tích hợp sẵn
Mỗi ngôn ngữ lập trình chính đều tích hợp ít nhất một mô-đun tạo số ngẫu nhiên (RNG). Bảng dưới đây tóm tắt các tùy chọn được sử dụng phổ biến nhất và phân loại bảo mật của chúng:
| Ngôn ngữ | PRNG tiêu chuẩn | Bộ tạo số ngẫu nhiên mật mã | Ghi chú |
|---|---|---|---|
| Python | Ngẫu nhiên (Mersenne Twister) | bí mật, os.urandom() | Hãy sử dụng các bí mật cho mã thông báo, mật khẩu và khóa. |
| JavaScript | Math.random() | crypto.getRandomValues() | API mã hóa web có sẵn trên tất cả các trình duyệt hiện đại. |
| Java | java.util.Random | java.security.SecureRandom | SecureRandom sẽ chặn các khối cho đến khi có đủ entropy. |
| C / C++ | rand() (tránh sử dụng trong môi trường sản xuất) | /dev/urandom, lệnh RDRAND | Hàm rand() khá yếu; hãy sử dụng entropy cấp hệ điều hành cho bất kỳ tác vụ nghiêm túc nào. |
| Đi | toán/rand | tiền điện tử/rand | crypto/rand đọc trực tiếp từ CSPRNG của hệ điều hành. |
| Hồng ngọc | Ngẫu nhiên (dựa trên MT) | Ngẫu nhiên an toàn | SecureRandom bao bọc OpenSSL hoặc /dev/urandom |
| PHP | rand(), mt_rand() | random_bytes(), random_int() | Hàm random_int() được hỗ trợ bởi CSPRNG kể từ PHP 7. |
Thiết bị RNG phần cứng
Đối với các ứng dụng yêu cầu độ ngẫu nhiên cao nhất — chẳng hạn như tạo khóa chứng chỉ, mô-đun bảo mật phần cứng (HSM) hoặc thiết bị khoa học — có sẵn các bộ tạo số ngẫu nhiên phần cứng chuyên dụng (HRNG):
- Intel RDRAND / RDSEED — Các lệnh cấp CPU lấy mẫu nhiễu nhiệt từ mạch trên chip, có sẵn trên hầu hết các bộ xử lý x86 hiện đại kể từ Ivy Bridge (2012).
- Các thiết bị tạo số ngẫu nhiên tỷ lệ cao chuyên dụng cắm vào cổng USB — Các thiết bị như OneRNG hoặc TrueRNG cắm vào cổng USB và cung cấp dữ liệu ngẫu nhiên cho nhóm ngẫu nhiên của hệ điều hành thông qua /dev/random hoặc /dev/urandom trên Linux.
- HSM (Hardware Security Modules) — Các thiết bị cấp doanh nghiệp từ các nhà cung cấp như Thales, Entrust và AWS CloudHSM, tạo và lưu trữ các khóa mã hóa bằng cách sử dụng các nguồn entropy phần cứng được chứng nhận.
- Các dịch vụ tạo số ngẫu nhiên lượng tử — API đám mây từ ID Quantique và ANU (Đại học Quốc gia Úc) cung cấp các bit ngẫu nhiên được tạo ra từ sự dao động chân không lượng tử, mang lại kết quả đầu ra được chứng minh là không xác định.
Tự động hóa và tích hợp quy trình làm việc
Tự động hóa việc tạo số ngẫu nhiên trong các quy trình làm việc lớn hơn — các quy trình thử nghiệm A/B, mô phỏng Monte Carlo, xổ số theo lịch trình hoặc lấy mẫu kiểm toán ngẫu nhiên — thường bao gồm một trong ba cách tiếp cận sau:
- Tích hợp API — RANDOM.ORG cung cấp API JSON-RPC trả về các số nguyên, chuỗi, chuỗi ký tự và UUID ngẫu nhiên thực sự. Các yêu cầu được xác thực cho phép hạn mức cao hơn và tính ngẫu nhiên được ký bằng chứng chỉ xác thực có thể kiểm chứng.
- Khởi tạo chuỗi CI/CD — Các công cụ kiểm thử thống kê như TestU01 hoặc Dieharder có thể được chạy tự động trong các chuỗi tích hợp liên tục để xác nhận rằng bất kỳ triển khai RNG tùy chỉnh nào cũng duy trì chất lượng thống kê xuyên suốt các thay đổi mã.
- Lập lịch trình gốc của nền tảng — Các nền tảng đám mây (AWS Lambda, Google Cloud Functions, Azure Functions) có thể kích hoạt các quy trình dựa trên thuật toán tạo số ngẫu nhiên theo lịch trình, ví dụ như để lấy mẫu ngẫu nhiên các mục nhật ký cho các cuộc kiểm tra bảo mật hoặc để chỉ định các nhóm ngẫu nhiên hàng ngày trong các thí nghiệm hành vi.
Các công cụ như AutoSEO chứng minh cách tự động hóa có thể mở rộng ngay cả đến quy trình làm việc về nội dung và dữ liệu phụ thuộc vào việc lấy mẫu ngẫu nhiên. AutoSEO tự động hóa quá trình xác định, kiểm tra và ưu tiên các nhiệm vụ SEO bằng cách sử dụng các kỹ thuật lấy mẫu ngẫu nhiên để chọn các tập con trang đại diện từ các tập dữ liệu thu thập được lớn — đảm bảo rằng các kiểm tra chất lượng là không thiên vị và không có điểm mù có hệ thống nào xuất hiện do luôn kiểm tra cùng một trang có lưu lượng truy cập cao. Điều này phản ánh cùng một logic được sử dụng trong các thử nghiệm đối chứng ngẫu nhiên: bằng cách đưa tính ngẫu nhiên có cấu trúc vào quá trình lựa chọn, AutoSEO tạo ra các đánh giá sức khỏe trang web có giá trị thống kê cao hơn so với các công cụ kiểm toán dựa trên quy tắc xác định.
Làm thế nào để đo lường chất lượng và sự thành công của bộ tạo số ngẫu nhiên?
Một bộ tạo số ngẫu nhiên tốt phải vượt qua các bài kiểm tra thống kê về tính đồng nhất, tính độc lập và tính không thể dự đoán được. Các tiêu chí chính là bộ kiểm thử thực nghiệm, phân tích chu kỳ lý thuyết và – đối với các bộ tạo số ngẫu nhiên mật mã – khả năng chống lại các cuộc tấn công tái tạo trạng thái.
Bộ kiểm định thống kê
Không thể chứng minh bất kỳ chuỗi hữu hạn nào là hoàn toàn ngẫu nhiên, nhưng có thể kiểm tra các chuỗi để phát hiện tính không ngẫu nhiên. Các bộ kiểm định đáng tin cậy nhất là:
- NIST SP 800-22 — Bộ 15 bài kiểm tra thống kê do Viện Tiêu chuẩn và Công nghệ Quốc gia (NIST) công bố, được sử dụng để đánh giá các bộ tạo số ngẫu nhiên (RNG) được đệ trình để chứng nhận mật mã. Các bài kiểm tra bao gồm kiểm tra tần số, kiểm tra chuỗi, kiểm tra phổ (DFT) và kiểm tra nối tiếp.
- TestU01 (BigCrush) — Được phát triển tại Đại học Montreal, BigCrush là bộ kiểm định thống kê khắt khe nhất hiện có. Các thuật toán như LCG và các thuật toán tạo Wichmann-Hill cũ hơn đều không vượt qua được; Xoshiro256** và PCG thì vượt qua được.
- Dieharder — Một phiên bản mở rộng mã nguồn mở của bộ kiểm thử Diehard gốc của George Marsaglia, thực hiện hơn 100 bài kiểm tra trên các mẫu lớn về đầu ra của máy phát điện.
- PractRand — Một bộ công cụ kiểm thử hiện đại có khả năng mở rộng đến các kích thước mẫu rất lớn (hàng terabyte dữ liệu đầu ra), có thể phát hiện ra những sai lệch tinh tế mà các bài kiểm thử trên mẫu nhỏ hơn không thể nhận thấy.
Các chỉ số chất lượng chính
- Độ dài chu kỳ — Số lượng giá trị được tạo ra trước khi chuỗi lặp lại. Thuật toán Mersenne Twister có chu kỳ là 2 19937 −1, đủ cho hầu hết các ứng dụng không liên quan đến mật mã.
- Phân bổ đồng đều — Liệu các giá trị có được phân bố đồng đều trên toàn bộ phạm vi đầu ra trong một chiều, hai chiều và các phép chiếu đa chiều hay không.
- Độ nhạy của hạt giống — Liệu những thay đổi nhỏ trong hạt giống có tạo ra các chuỗi kết quả hoàn toàn khác nhau hay không (quan trọng đối với khả năng tái tạo của mô phỏng).
- Thông lượng — Tốc độ đầu ra tính bằng MB/giây hoặc hàng tỷ số mỗi giây, phù hợp với các tác vụ Monte Carlo hiệu năng cao.
- Bảo mật tiến và lùi — Đối với CSPRNG, liệu kẻ tấn công quan sát đầu ra tại thời điểm T có thể tái tạo lại đầu ra trong quá khứ hoặc tương lai hay không. Điều này được kiểm tra bằng cách cố gắng tái tạo trạng thái từ các bit đã quan sát được.
Đo lường sự thành công trong các bối cảnh ứng dụng
Ngoài chất lượng kỹ thuật, các chỉ số đánh giá thành công còn phụ thuộc vào bối cảnh triển khai:
- Xổ số và quay số — Nhật ký kiểm toán, xác minh của bên thứ ba và chứng chỉ ngẫu nhiên có chữ ký (có sẵn từ RANDOM.ORG) chứng minh tính công bằng cho người tham gia.
- Các ứng dụng mật mã — Việc tuân thủ chứng nhận FIPS 140-3 hoặc Common Criteria xác nhận rằng nguồn entropy và CSPRNG đáp ứng các tiêu chuẩn của chính phủ và ngành.
- Mô phỏng khoa học — Khả năng tái tạo (cùng một hạt giống tạo ra cùng một kết quả) và khả năng vượt qua kiểm thử BigCrush hoặc PractRand với kích thước mẫu được sử dụng trong mô phỏng.
- Thử nghiệm A/B — Kiểm tra cân bằng xác nhận rằng nhóm điều trị và nhóm đối chứng tương đương nhau về mặt thống kê trên các biến số trước thí nghiệm, chứng minh rằng việc chọn ngẫu nhiên là không thiên vị.
Câu hỏi thường gặp
Sự khác biệt giữa bộ tạo số ngẫu nhiên thực sự và bộ tạo số giả ngẫu nhiên là gì?
Máy tạo số ngẫu nhiên thực sự (TRNG) tạo ra tính ngẫu nhiên từ một quá trình vật lý không thể dự đoán được — chẳng hạn như nhiễu nhiệt, phân rã phóng xạ hoặc nhiễu sóng radio trong khí quyển — và tạo ra đầu ra thực sự không mang tính xác định. Máy tạo số giả ngẫu nhiên (PRNG) sử dụng thuật toán toán học xác định được gieo hạt với một giá trị ban đầu; với cùng một hạt giống, nó luôn tạo ra cùng một chuỗi. PRNG nhanh hơn và có thể tái tạo được, lý tưởng cho các mô phỏng và trò chơi. TRNG chậm hơn nhưng cần thiết khi tính không thể dự đoán được là một yêu cầu bảo mật, chẳng hạn như tạo khóa mật mã.
Liệu việc sử dụng Math.random() trong JavaScript có an toàn về mặt bảo mật không?
Không. Math.random() của JavaScript là một bộ tạo số ngẫu nhiên giả (PRNG) được ghi rõ là không an toàn về mặt mật mã. Trạng thái bên trong của nó có thể được tái tạo từ đầu ra quan sát được, và nó không bao giờ được sử dụng để tạo mật khẩu, mã thông báo phiên, khóa API hoặc bất kỳ giá trị nào mà kẻ tấn công đoán được đầu ra có thể gây hại. Đối với các ứng dụng nhạy cảm về bảo mật trong trình duyệt, hãy sử dụng crypto.getRandomValues() từ Web Crypto API, được hỗ trợ bởi CSPRNG của hệ điều hành.
Liệu một bộ tạo số ngẫu nhiên có thể thực sự không thể dự đoán được?
Một bộ tạo số ngẫu nhiên thực (TRNG) dựa trên phần cứng được tạo ra từ các hiện tượng lượng tử — chẳng hạn như thời gian đến của photon hoặc dao động chân không lượng tử — được coi là không thể dự đoán được về mặt cơ bản theo cơ học lượng tử, có nghĩa là không có thuật toán hoặc thông tin bổ sung nào có thể cho phép người quan sát dự đoán đầu ra của nó tốt hơn so với xác suất ngẫu nhiên. Các bộ tạo số ngẫu nhiên giả (PRNG) và hầu hết các bộ tạo số ngẫu nhiên giả dựa trên mạng (CSPRNG) bằng phần mềm đều không thể dự đoán được về mặt tính toán theo các giả định mật mã tiêu chuẩn, có nghĩa là chúng an toàn trong thực tế nhưng không thể chứng minh là không thể dự đoán được theo nghĩa vật lý tuyệt đối.
Việc gieo hạt ảnh hưởng đến bộ tạo số ngẫu nhiên như thế nào?
Giá trị khởi tạo (seed) là giá trị ban đầu được đưa vào thuật toán tạo số ngẫu nhiên giả (PRNG). Cùng một giá trị khởi tạo luôn tạo ra cùng một chuỗi, đây là một đặc điểm trong tính toán khoa học vì nó giúp các thí nghiệm có thể tái tạo được. Một giá trị khởi tạo kém – chẳng hạn như chỉ sử dụng giây hiện tại làm nguồn entropy duy nhất – sẽ làm giảm đáng kể tính ngẫu nhiên hiệu quả vì kẻ tấn công có thể liệt kê tất cả các giá trị khởi tạo khả thi. Thực hành tạo giá trị khởi tạo tốt kết hợp nhiều nguồn entropy: thời gian hiện tại tính bằng nano giây, ID tiến trình, địa chỉ bộ nhớ và entropy do hệ điều hành cung cấp từ /dev/urandom hoặc CryptGenRandom trên Windows.
Mô-đun `random` của Python sử dụng bộ tạo số ngẫu nhiên nào?
Mô-đun random của Python sử dụng thuật toán Mersenne Twister (MT19937), có chu kỳ là 2¹⁹937 − 1 và vượt qua hầu hết các bài kiểm tra thống kê. Nó phù hợp cho mô phỏng, trò chơi và lấy mẫu thống kê. Tuy nhiên, nó không an toàn về mặt mật mã — trạng thái bên trong có thể được tái tạo sau khi quan sát 624 đầu ra 32 bit liên tiếp. Đối với các công việc nhạy cảm về bảo mật trong Python, hãy sử dụng mô-đun secrets , được hỗ trợ bởi os.urandom() và lấy mẫu từ bộ tạo số ngẫu nhiên có thể phân biệt được bằng mật mã (CSPRNG) cấp hệ điều hành.
Làm thế nào để tạo ra các số ngẫu nhiên mà không cần máy tính?
Trước khi có máy tính, các số ngẫu nhiên được tạo ra bằng các phương pháp vật lý: tung xúc xắc, rút các quả bóng được đánh số từ một cái trống quay, tung đồng xu hoặc xáo bài. Tập đoàn RAND đã xuất bản một cuốn sách nổi tiếng vào năm 1955 có tựa đề " Một triệu chữ số ngẫu nhiên với 100.000 độ lệch chuẩn" , được tạo ra bởi một bánh xe roulette điện tử. Bảng thống kê các số ngẫu nhiên được sử dụng rộng rãi trong lấy mẫu khảo sát và thử nghiệm lâm sàng. Ngày nay, các phương pháp thủ công vẫn được sử dụng trong một số xổ số được quản lý và trong các bài trình diễn trên lớp, mặc dù chúng chậm hơn và khó kiểm toán hơn so với các phương pháp điện tử.
Tại sao cần phải kiểm tra các bộ tạo số ngẫu nhiên?
Ngay cả các thuật toán được thiết kế để tạo ra kết quả trông có vẻ ngẫu nhiên cũng có thể chứa những sai lệch tinh vi, các chu kỳ ngắn ở một số chiều nhất định, hoặc các mối tương quan giữa các giá trị liên tiếp mà người ta không thể nhận thấy bằng mắt thường nhưng có thể phát hiện được bằng các bài kiểm tra thống kê. Những lỗi này có thể làm mất hiệu lực kết quả mô phỏng, làm giảm tính bảo mật của các hệ thống mật mã, hoặc gây ra sự bất công trong các trò chơi và xổ số. Việc kiểm tra bằng các bộ kiểm thử như NIST SP 800-22, BigCrush hoặc PractRand giúp phát hiện những vấn đề này trước khi triển khai. Các ví dụ trong quá khứ về các bộ tạo số ngẫu nhiên bị lỗi — bao gồm các phiên bản đầu tiên của mt_rand() của PHP và lỗi OpenSSL của Debian năm 2008 — cho thấy rằng các bộ tạo số ngẫu nhiên chưa được kiểm thử có thể gây ra những lỗi bảo mật nghiêm trọng.
Máy tạo số giả ngẫu nhiên an toàn về mặt mật mã (CSPRNG) là gì?
CSPRNG là một PRNG đáp ứng hai yêu cầu bảo mật bổ sung ngoài chất lượng thống kê: kiểm tra bit tiếp theo (không thuật toán nào có thể dự đoán bit tiếp theo với xác suất tốt hơn đáng kể so với 50% khi biết tất cả các bit trước đó) và khả năng chống mở rộng trạng thái bị xâm phạm (nếu kẻ tấn công biết được trạng thái nội bộ tại thời điểm T, chúng không thể khôi phục đầu ra từ trước thời điểm T). Các CSPRNG hiện đại bao gồm các bộ tạo dựa trên ChaCha20 (được sử dụng trong /dev/urandom của Linux kể từ kernel 4.8), Fortuna (được sử dụng trong macOS và iOS) và CTR_DRBG (được NIST tiêu chuẩn hóa trong SP 800-90A).
Liệu các bộ tạo số ngẫu nhiên có thể tạo ra các giá trị trùng lặp không?
Đúng vậy, và đây là hành vi được mong đợi. Một quá trình ngẫu nhiên thực sự không có bộ nhớ về các kết quả trước đó, vì vậy các giá trị trùng lặp xuất hiện một cách tự nhiên — điều này được mô tả bởi bài toán sinh nhật trong lý thuyết xác suất. Trong một lần rút thăm đồng đều từ 1 đến N, các giá trị trùng lặp trở nên dễ xảy ra khi đã rút được khoảng √N giá trị. Nếu ứng dụng của bạn yêu cầu các giá trị duy nhất (chẳng hạn như gán ID duy nhất hoặc xáo trộn bộ bài mà không có giá trị lặp lại), bạn nên sử dụng thuật toán xáo trộn như Fisher-Yates trên một tập hợp được xác định trước, hoặc duy trì một tập hợp các giá trị đã được sử dụng và loại bỏ các giá trị trùng lặp, thay vì dựa vào đầu ra RNG thô để tránh xung đột.
Các công cụ xổ số và quay số trực tuyến đảm bảo tính công bằng như thế nào?
Các công cụ quay số trực tuyến uy tín đảm bảo tính công bằng thông qua sự kết hợp của các yếu tố: sử dụng nguồn entropy chất lượng cao (lý tưởng là TRNG thay vì Math.random()), công bố thuật toán và hạt giống trước khi quay số để kết quả có thể được xác minh độc lập, cung cấp chứng chỉ ngẫu nhiên có chữ ký chứng minh các số được tạo ra trước khi kết thúc quay số, và tiến hành quay số trước sự chứng kiến của các kiểm toán viên độc lập. RANDOM.ORG cung cấp Dịch vụ Quay số Bên thứ ba, ghi dấu thời gian và ký mã hóa cho mỗi lần quay số, tạo ra một bản ghi có thể kiểm toán. Đối với các xổ số được quản lý, các cơ quan quản lý trò chơi quốc gia yêu cầu các RNG phần cứng được chứng nhận và sự chấp thuận của phòng thí nghiệm kiểm tra độc lập trước khi bất kỳ hệ thống nào được đưa vào hoạt động.
Stop doing SEO by hand
Put your SEO on autopilot — your first 3 articles for $1
Auto SEO scans your site, builds a content plan, and writes ranking-ready articles automatically. Start your $1 trial — the AI writes your first 3 the moment you begin. Cancel anytime in 3 days.
2,147+ businesses · Cancel anytime · No lock-in