2013-12-08 14 views
10

Tôi đã cố gắng hiểu và tìm hiểu xem tôi có nên sử dụng os.urandom() hoặc Crypto.Random.new() cho các số giả ngẫu nhiên mã hóa an toàn không.Thư viện pycrypto của Python để tạo số ngẫu nhiên và os.urandom

Các trang web sau đây dường như đề nghị sử dụng os.urandom():

https://github.com/mozilla/PyHawk/pull/13

nhưng tôi không thực sự hiểu tại sao và các trang web khác tôi tìm thấy trực tuyến không thực sự giải thích cái nào để sử dụng.

Nếu bất kỳ ai biết cái nào an toàn để sử dụng mật mã, tôi sẽ đánh giá cao lời khuyên!

Một trong những điều đặc biệt lo lắng là tôi dự định sử dụng nó để tạo số ngẫu nhiên nhưng tôi lo rằng một ngày nào đó tôi tạo ra một số ngẫu nhiên và ngày hôm sau trạng thái của máy phát sẽ giống nhau bắt đầu tạo các số "ngẫu nhiên" giống nhau.

+0

Cả hai đều hoạt động. – U2EF1

+1

@ U2EF1 Đối với một cái gì đó quan trọng và khó xác minh là tính chính xác của CSPRNG, bạn sẽ phải cung cấp nhiều hơn một chút so với xác nhận offhand. – delnan

+0

['ssl.RAND_bytes()' docs] (http://docs.python.org/3.4/library/ssl.html#ssl.RAND_bytes) khuyên bạn nên đọc [Wikipedia] (http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator) để nhận các yêu cầu của CSPRNG. – jfs

Trả lời

9

Trong liên kết bạn đã cho, lý do chỉ trao cho thích urandom() là nó kéo ít mã trong (hệ điều hành thực hiện "nhất của nó", và os.urandom() được xây dựng trong Python).

Nếu bạn định phân phối gói Python, bạn có thể đơn giản hóa cuộc sống của người dùng bằng cách giảm thiểu các phụ thuộc bên ngoài. Đó là toàn bộ điểm của liên kết bạn tìm thấy.

Về chất lượng, một trong hai cách sẽ hoạt động tốt. Tôi thích urandom() vì tôi hiểu nó làm gì; Tôi không bao giờ đào sâu vào ruột của PyCrypto. Nhưng urandom() đã bị chỉ trích sử dụng trong một số môi trường. Click this và cuộn xuống đến phần bắt đầu

Gutterman, Pinkas, & Reinman tháng 3 năm 2006 đã công bố một phân tích mật mã chi tiết của bộ tạo số ngẫu nhiên Linux ...

4

urandomkhông trả lại số an toàn mã hóa, với báo trước. Nếu nó chạy ra khỏi entropy (dữ liệu ngẫu nhiên thực được tạo ra bởi chuyển động của chuột, biến động nhiệt độ CPU trên chip Ivy Bridge +, vv), nó sẽ bắt đầu tạo ra các số giả ngẫu nhiên kém an toàn hơn. Chúng được tạo ra bởi một máy phát điện mạnh mẽ, nhưng tùy thuộc vào ứng dụng của bạn, chúng có thể không đủ ngẫu nhiên. Trên các hệ thống Unix, /dev/random sẽ chặn trong khi chờ đợi thêm entropy, trong khi /dev/urandom sẽ bắt đầu tạo các số giả ngẫu nhiên.

Tôi không am hiểu về PyCrypto, tuy nhiên khi đọc nguồn, có vẻ như Crypto/Random/OSRNG/posix.py chỉ cần đọc từ /dev/urandom - vì vậy tôi sẽ không lo lắng quá nhiều về lựa chọn.

9

tôi đi cho os.urandom. Trên tất cả các triển khai Python (gần đây) mà tôi đã kiểm tra, nó thực hiện điều đúng bằng cách chỉ cần mở một kết nối không bị chặn tới /dev/urandom hoặc thiết bị tương đương trên các nền tảng không phải Linux khác.

Mặt khác, PyCrypto Crypto.Random là trình bao bọc rất phức tạp dựa trên Fortuna. Việc xây dựng phức tạp như vậy có thể được thực hiện với hy vọng giảm nhẹ một số sai sót của hệ điều hành cơ bản.Thật không may:

  • Nó vẫn kéo entropy từ /dev/urandom (trên Linux), vì vậy nếu hệ điều hành bị hỏng, PyCrypto của Crypto.Random sẽ bị phá vỡ quá (đánh bại mục đích của nó)
  • Lựa chọn đó đã phản tác dụng, vì nó là rất khó khăn để đối phó với việc tìm kiếm và các trường hợp mà cùng một entropy được tái sử dụng bởi các quá trình khác nhau (xem CVE-2013-1445).
  • Mã Fortuna không được bao hàm bởi các kiểm tra đơn vị và thuật toán Fortuna không đi kèm với các vectơ thử nghiệm. Điều đó một mình buộc bạn phải thực hiện một bước nhảy vọt lớn.
Các vấn đề liên quan