it-swarm-vi.com

Rand từ / dev / urandom có ​​an toàn cho khóa đăng nhập không?

Hãy nói rằng tôi muốn tạo cookie cho người dùng. Đơn giản chỉ cần tạo một chuỗi 1024 bit bằng cách sử dụng / dev/urandom và kiểm tra xem nó đã tồn tại chưa (lặp cho đến khi tôi nhận được một duy nhất) đủ?

Tôi có nên tạo khóa dựa trên cái gì khác không? Đây có phải là một xu hướng khai thác bằng cách nào đó?

187
Incognito

Câu trả lời ngắn gọn là có. Câu trả lời dài cũng có. /dev/urandom mang lại dữ liệu không thể phân biệt được với tính ngẫu nhiên thực sự, với công nghệ hiện có. Nhận ngẫu nhiên "tốt hơn" so với những gì /dev/urandom cung cấp là vô nghĩa, trừ khi bạn đang sử dụng một trong số ít thuật toán mã hóa "lý thuyết thông tin", đây không phải là trường hợp của bạn (bạn sẽ biết điều đó).

Trang man cho urandom có phần sai lệch, được cho là hoàn toàn sai, khi nó gợi ý rằng /dev/urandom có thể "hết entropy" và /dev/random nên được ưu tiên; tức thì duy nhất trong đó /dev/urandom might ngụ ý vấn đề bảo mật do entropy thấp là trong những khoảnh khắc đầu tiên của quá trình cài đặt hệ điều hành tự động mới; Nếu máy khởi động đến một điểm mà nó đã bắt đầu có một số hoạt động mạng thì nó đã thu thập đủ ngẫu nhiên vật lý để cung cấp tính ngẫu nhiên đủ chất lượng cao cho tất cả các ứng dụng thực tế (tôi đang nói về Linux ở đây, trên FreeBSD, tức thì ngay lập tức điểm yếu không xảy ra chút nào). Mặt khác, /dev/random có xu hướng chặn vào thời điểm không thuận lợi, dẫn đến các vấn đề về khả năng sử dụng rất thực tế và vô cùng. Hoặc, để nói nó bằng ít từ hơn: sử dụng /dev/urandom và hạnh phúc; sử dụng /dev/random và xin lỗi.

( Chỉnh sửa: trang Web này giải thích sự khác biệt giữa /dev/random/dev/urandom khá rõ ràng.)

Với mục đích tạo ra một "cookie": một cookie như vậy sao cho không có hai người dùng chia sẻ cùng một cookie và nó không thể tính toán được cho bất kỳ ai để "đoán" giá trị của một cookie hiện có. Một chuỗi các byte ngẫu nhiên thực hiện tốt điều đó, miễn là nó sử dụng tính ngẫu nhiên có chất lượng đầy đủ (/dev/urandom vẫn ổn) và đó là đủ lâu. Theo nguyên tắc thông thường, nếu bạn có ít hơn 2n người dùng ( n = 33 nếu toàn bộ dân số Trái đất có thể sử dụng hệ thống của bạn), thì chuỗi n + 128 bit đủ rộng ; bạn thậm chí không phải kiểm tra sự va chạm với các giá trị hiện có: bạn sẽ không thấy nó trong suốt cuộc đời của mình. 161 bit phù hợp với 21 byte.

are một số thủ thuật có thể thực hiện được nếu bạn muốn cookie ngắn hơn và vẫn muốn tránh tìm kiếm sự va chạm trong cơ sở dữ liệu của bạn. Nhưng điều này hầu như không cần thiết cho một cookie (tôi giả sử bối cảnh dựa trên Web). Ngoài ra, hãy nhớ giữ bí mật cookie của bạn (nghĩa là sử dụng HTTPS và đặt cờ "an toàn" và "httpOnly" của cookie).

222
Thomas Pornin

Vâng, đó là một cách tuyệt vời.

@ Thomas giải thích móng tay nó. Và anh ta hoàn toàn đúng khi chỉ trích /dev/urandom trang nam. Tại chỗ trên.

Nhưng bỏ qua "kiểm tra nếu nó đã tồn tại". Kiểm tra đó là vô nghĩa. Nó sẽ không xảy ra. (Khả năng xảy ra điều đó thấp hơn xác suất bị sét đánh - nhiều lần - trong cùng một ngày.)

25
D.W.

Lưu ý các trường hợp Edge nếu bạn đang sử dụng Linux hoặc NetBSD.

Trên Linux, bạn muốn đảm bảo rằng đã thu được đủ entropy sau khi khởi động để tạo đúng CSPRNG hoặc sử dụng getrandom() gọi hệ thống để đọc từ /dev/urandom và chỉ chặn trong trường hợp hiếm hoi có đủ entropy hạt giống ban đầu sau khởi động.

Trong NetBSD, bạn muốn đọc từ /dev/random ít nhất một lần trước khi đọc từ /dev/urandom để đảm bảo nó đã được gieo hạt đúng cách.

Trên FreeBSD và MacOS, không có sự khác biệt giữa /dev/random/dev/urandom.

Câu trả lời ngắn gọn vẫn là sử dụng /dev/urandom.

Xem Khi nào nên sử dụng/dev/Random vs/dev/urandom để biết thêm chi tiết.

1
Tom Hale