Đọc từ dev / urandom - hành vi hệ thống

Aug 24 2020

Khi đọc từ dev/urandom, với say headhoặc dd, tất nhiên được mong đợi rằng đầu ra luôn ngẫu nhiên và khác nhau.

Làm thế nào điều này được xử lý bởi UNIX ở mức thấp? Tệp có tự nhiên bị cắt ngắn khi đọc hay thay vào đó là tệp thực sự là một giao diện cho mật mã đối xứng hoặc tương đương và như vậy “đọc” thực sự là hành động thực thi mật mã.

Trả lời

13 StephenKitt Aug 24 2020 at 21:15

/dev/urandomlà một thiết bị ký tự, không phải là một tệp thông thường. Mở nó cung cấp một giao diện cho một trình điều khiển, thường là trong nhân, xử lý các lần đọc; mỗi khi chương trình đọc từ /dev/urandom, một cuộc gọi được thực hiện đến trình điều khiển và trình điều khiển xác định cách cung cấp nội dung thích hợp (giống như bất kỳ thiết bị ký tự nào khác - /dev/null, /dev/zero...).

Trên Linux, điều này được thực hiện trong drivers/char/random.c. Nó duy trì một "nhóm entropy", được gieo từ nhiều nguồn dữ liệu ngẫu nhiên khác nhau và khi đọc, xử lý dữ liệu nhóm bằng cách sử dụng mật mã luồng ChaCha để xây dựng dữ liệu để trả về.

8 Ángel Aug 24 2020 at 21:44

/dev/urandomkhông phải là một 'tệp thông thường' (vâng, đây là cách đặt tên POSIX), nó là một thiết bị. Cũng giống như hầu hết các 'tệp' trên / dev / Vì vậy, bạn có rất nhiều hành vi kỳ diệu ở đó.

  • Bạn có /dev/null, bất kể bạn viết bao nhiêu, nó không bao giờ lấp đầy
  • Bạn có ngẫu nhiên / urandom / srandom, cung cấp ngẫu nhiên các dữ liệu khác nhau mỗi lần
  • Bạn có /dev/tty(và đồng nghiệp) nơi bạn tương tác với một thiết bị đầu cuối
  • Bạn có /dev/fullmà luôn trả về "Không còn dung lượng trên thiết bị" cho bất kỳ nỗ lực ghi nào
  • Bạn có /dev/zeromà trả về một tập hợp nul byte vô hạn

và nhiều thứ khác nữa.

Các tệp này thực sự là một giao diện để tương tác với một mô-đun nhân. Vì vậy, khi bạn 'đọc' nó, nó thực sự đang thực thi một hàm được yêu cầu đọc bao nhiêu byte mà chương trình của bạn (head, dd, v.v.) yêu cầu ( /dev/urandomlà một thiết bị ký tự ). Sau đó, hàm này sẽ xử lý nó bên trong (dựa trên một số vùng entropy) để lấp đầy bộ đệm đó (trong trường hợp này, để bạn nhận được nội dung giả ngẫu nhiên).