Tiêu đề và nội dung câu hỏi của bạn đặt ra hai câu hỏi khác nhau: hệ điều hành tạo entropy như thế nào (điều này thực sự cần có được entropy) và cách nó tạo ra giả ngẫu nhiên từ entropy này. Tôi sẽ bắt đầu bằng cách giải thích sự khác biệt.
Sự ngẫu nhiên đến từ đâu?
Trình tạo số ngẫu nhiên (RNG) có hai loại:
Một số ứng dụng, chẳng hạn như mô phỏng các hiện tượng vật lý, có thể là nội dung với các số ngẫu nhiên vượt qua các bài kiểm tra thống kê. Các ứng dụng khác, chẳng hạn như tạo ra các khóa mật mã, đòi hỏi một thuộc tính mạnh hơn: không thể đoán trước . Không thể đoán trước là một thuộc tính bảo mật, không phải (chỉ) một thuộc tính thống kê: nó có nghĩa là một đối thủ không thể đoán đầu ra của trình tạo số ngẫu nhiên. (Chính xác hơn, bạn có thể đo chất lượng của RNG bằng cách đo xác suất để kẻ thù đoán được từng bit đầu ra RNG. Nếu xác suất khác với 1/2, thì RNG là xấu.)
Có những hiện tượng vật lý tạo ra dữ liệu ngẫu nhiên với các thuộc tính thống kê tốt - ví dụ, phân rã phóng xạ hoặc một số quan sát thiên văn về nhiễu nền hoặc biến động của thị trường chứng khoán. Các phép đo vật lý như vậy cần điều hòa ( làm trắng ), để biến phân phối xác suất sai lệch thành phân phối xác suất thống nhất. Một phép đo vật lý mà mọi người đều biết là không tốt cho mật mã: biến động của thị trường chứng khoán có thể tốt cho việc đánh dấu địa lý , nhưng bạn không thể sử dụng chúng để tạo khóa bí mật .
Mật mã học đòi hỏi bí mật : một kẻ thù không thể tìm ra dữ liệu đi vào điều hòa. Có các trình tạo số giả ngẫu nhiên an toàn bằng mật mã (CSPRNG): Các thuật toán PRNG có đầu ra phù hợp để sử dụng trong các ứng dụng mã hóa, ngoài việc có các thuộc tính thống kê tốt . Một trong những đặc tính làm cho CSPRNG được bảo mật bằng mật mã là đầu ra của nó không cho phép đối thủ tái cấu trúc trạng thái bên trong (biết tất cả các bit nhưng một bit được tạo bởi CSPRNG không giúp tìm ra bit bị thiếu). Tôi sẽ không đi sâu vào cách tạo CSPRNG vì đó là một cách dễ dàng - bạn có thể làm theo các công thức được đưa ra bởi các nhà mật mã chuyên nghiệp (sử dụng một tiêu chuẩnthuật toán, chẳng hạn như Hash_DRBG, HMAC_DRBG hoặc CTR_DRBG từ NIST SP 800-90A ) hoặc ANSI X9.31 PRNG . CSPRNG yêu cầu hai thuộc tính của trạng thái của nó để được bảo mật:
- Trạng thái phải được giữ bí mật ngay từ đầu và mọi lúc (mặc dù việc tiếp xúc với trạng thái sẽ không tiết lộ kết quả đầu ra trong quá khứ).
- Trạng thái phải tuyến tính: RNG không bao giờ được bắt đầu hai lần từ cùng một trạng thái.
Kiến trúc của một trình tạo số ngẫu nhiên
Trong thực tế, hầu hết tất cả các trình tạo số ngẫu nhiên tốt đều kết hợp CSPRNG với một hoặc nhiều nguồn entropy . Nói một cách ngắn gọn, entropy là thước đo cho sự khó đoán của một nguồn dữ liệu. Dựa vào một trình tạo số ngẫu nhiên hoàn toàn trên RNG phần cứng là khó khăn:
- Dữ liệu vật lý thô có khả năng cần điều hòa dù sao, để biến dữ liệu xác suất thành phân phối đồng đều.
- Đầu ra từ nguồn ngẫu nhiên phải được giữ bí mật.
- Nguồn Entropy thường chậm so với nhu cầu.
Do đó, RNG trong một hệ điều hành hầu như luôn hoạt động như thế này :
- Tích lũy đủ entropy để xây dựng một trạng thái nội bộ không thể đoán trước.
- Chạy CSPRNG , sử dụng entropy tích lũy làm hạt giống, nghĩa là giá trị ban đầu của trạng thái bên trong.
- Tùy chọn, định kỳ trộn entropy bổ sung vào trạng thái nội bộ. (Điều này không thực sự cần thiết, vì entropy không phải là tiêu thụ của Google ở bất kỳ tỷ lệ có thể đo lường nào . Nó giúp chống lại các mối đe dọa nhất định làm rò rỉ trạng thái RNG mà không ảnh hưởng đến toàn bộ hệ thống.)
Dịch vụ tạo số ngẫu nhiên là một phần công việc của hệ điều hành, vì thu thập entropy yêu cầu quyền truy cập vào phần cứng và các nguồn entropy tạo thành tài nguyên dùng chung: hệ điều hành phải lắp ráp chúng và lấy đầu ra từ chúng sẽ phù hợp với các ứng dụng. Điều hòa giả ngẫu nhiên của các nguồn entropy là cần thiết trong hệ điều hành; nó cũng có thể được bảo mật bằng mật mã, bởi vì điều này về cơ bản không khó hơn (và nó được yêu cầu trên các hệ điều hành nơi các ứng dụng không tin tưởng lẫn nhau; trên các hệ thống hợp tác hoàn toàn, mỗi ứng dụng sẽ phải chạy CSPRNG bên trong nếu hệ điều hành dù sao cũng không cung cấp một cái nào).
Hầu hết các hệ thống có bộ lưu trữ liên tục sẽ tải một hạt giống RNG từ đĩa (Tôi sẽ sử dụng đĩa đĩa cứng như một tên viết tắt cho bất kỳ loại lưu trữ liên tục nào) khi chúng khởi động và ghi đè lên hạt giống với một số dữ liệu giả ngẫu nhiên mới được tạo từ hạt giống đó, hoặc nếu có sẵn với dữ liệu ngẫu nhiên được tạo từ hạt giống đó cộng với một nguồn entropy khác. Bằng cách này, ngay cả khi entropy không có sẵn sau khi khởi động lại, entropy từ phiên trước đó được sử dụng lại.
Một số chăm sóc phải được thực hiện về trạng thái lưu. Hãy nhớ làm thế nào tôi nói nhà nước phải tuyến tính? Nếu bạn khởi động hai lần từ cùng một trạng thái đĩa, bạn sẽ nhận được cùng một đầu ra RNG. Nếu đây là một khả năng trong môi trường của bạn, bạn cần một nguồn entropy khác. Cẩn thận khi khôi phục từ bản sao lưu hoặc khi nhân bản một máy ảo . Một kỹ thuật để nhân bản là trộn entropy được lưu trữ với một số dữ liệu môi trường có thể dự đoán được nhưng duy nhất (ví dụ: thời gian và địa chỉ MAC); lưu ý rằng nếu dữ liệu môi trường có thể dự đoán được, bất kỳ ai sở hữu trạng thái VM được lưu trữ đều có thể tái tạo lại hạt giống của một cá thể VM rẽ nhánh.
Nguồn Entropy
Tìm kiếm (và sử dụng chính xác) các nguồn entropy là phần khó khăn nhất của việc tạo số ngẫu nhiên trong một hệ điều hành. Các nguồn entropy có sẵn sẽ nhất thiết phải phụ thuộc vào phần cứng và môi trường mà phần cứng chạy vào.
Nếu bạn may mắn, phần cứng của bạn cung cấp một thiết bị ngoại vi có thể được sử dụng làm nguồn entropy: bộ tạo số ngẫu nhiên phần cứng , chuyên dụng hoặc có mục đích phụ. Ví dụ:
NIST SP800-90B cung cấp hướng dẫn thiết kế cho RNG phần cứng. Đánh giá một RNG phần cứng là khó khăn . RNG phần cứng thường là những con thú tinh vi, cần được sử dụng cẩn thận: nhiều loại cần một thời gian sau khi khởi động và một thời gian giữa các lần đọc để gây mất ổn định, chúng thường nhạy cảm với các điều kiện môi trường như nhiệt độ, v.v.
Bộ xử lý Intel x86-64 dựa trên kiến trúc Ivy Bridge cung cấp RdRand
hướng dẫn cung cấp đầu ra từ CSPRNG được tạo mầm bằng nhiễu nhiệt . Hầu hết các bộ xử lý điện thoại thông minh bao gồm một nguồn entropy phần cứng, mặc dù Android không phải lúc nào cũng sử dụng nó.
Các hệ thống thiếu nguồn entropy mạnh phải thực hiện bằng cách kết hợp các nguồn entropy yếu và hy vọng ( đảm bảo sẽ là một từ quá mạnh) mà chúng sẽ đủ. Chuyển động chuột ngẫu nhiên là phổ biến cho các máy khách và bạn có thể đã thấy chương trình bảo mật của một số chương trình mã hóa nhất định yêu cầu bạn di chuyển chuột (mặc dù trên bất kỳ hệ điều hành PC thế kỷ 21 nào, HĐH sẽ tích lũy entropy mà không cần ứng dụng làm phiền ).
Nếu bạn muốn xem xét một ví dụ, bạn có thể xem Linux, mặc dù vậy, hãy cẩn thận rằng nó không hoàn hảo . Cụ thể, /dev/random
các khối quá thường xuyên (vì nó chặn cho đến khi có đủ entropy, với khái niệm entropy quá bảo thủ), trong khi /dev/urandom
hầu như luôn luôn tốt trừ khi khởi động lần đầu nhưng không đưa ra dấu hiệu nào khi nó không đủ entropy. Linux có trình điều khiển cho nhiều thiết bị HRNG và tích lũy entropy từ các thiết bị khác nhau (bao gồm cả thiết bị đầu vào ) và định thời đĩa .
Nếu bạn có (bảo mật) lưu trữ liên tục, bạn có thể sử dụng nó để lưu entropy từ lần khởi động này sang lần khởi động tiếp theo, như đã nêu ở trên. Các khởi động đầu tiên là thời điểm nhạy cảm: hệ thống có thể được ở trong tình trạng khá có thể dự đoán tại thời điểm đó, đặc biệt là trên các thiết bị sản xuất hàng loạt mà chủ yếu hoạt động ra khỏi nhà máy trong cùng một cách. Một số thiết bị nhúng có bộ lưu trữ liên tục được cung cấp với một hạt giống ban đầu trong nhà máy (được sản xuất bởi RNG chạy trên máy tính trong nhà máy). Trong môi trường máy chủ ảo hóa, entropy ban đầu có thể được cung cấp khi khởi tạo máy ảo từ máy chủ hoặc từ máy chủ entropy.
Các thiết bị có hạt giống xấu là một vấn đề phổ biến trong thực tế - một nghiên cứu về các khóa RSA công khai cho thấy nhiều máy chủ và thiết bị có các khóa được tạo ra với RNG kém, rất có thể là một PRNG tốt, không đủ hạt giống. Là một nhà thiết kế hệ điều hành, bạn không thể tự mình giải quyết vấn đề này: đó là công việc của đơn vị kiểm soát chuỗi triển khai để đảm bảo RNG sẽ được gieo hạt giống ngay lần khởi động đầu tiên. Nhiệm vụ của bạn với tư cách là một nhà thiết kế hệ điều hành là cung cấp một RNG thích hợp, bao gồm một giao diện để cung cấp hạt giống đầu tiên đó và để đảm bảo báo hiệu lỗi thích hợp nếu RNG được sử dụng trước khi nó được gieo đúng cách.