Thêm số ngẫu nhiên entropy vào các khóa GPG?


10

Trong video sau: Linux HOWTO: Bảo mật dữ liệu của bạn với PGP, Phần 2 , bạn được hướng dẫn cách tạo một cặp khóa với gpg. Về 1:50, người hướng dẫn nói như sau:

Trong khi khóa đang được tạo, một ý tưởng tốt là di chuyển chuột của bạn xung quanh một chút để cung cấp cho nó một số entropy ngẫu nhiên hơn một chút để tạo ra khóa phím.

Điều này đối với tôi giống như một huyền thoại, đặc biệt là vì các công cụ dòng lệnh thường không bị ảnh hưởng bởi con trỏ. Mặt khác, tôi không biết làm thế nào trình tạo số ngẫu nhiên của Linux hoạt động, cho dù nó được chia sẻ bởi GUI hay độc lập với nó. Có bất kỳ cổ phiếu trong những gì ông tuyên bố, hoặc đây là một ví dụ về lập trình sùng bái hàng hóa ?


Là một câu hỏi phụ, đây có phải là cách sử dụng chính xác của "huyền thoại đô thị" hay có một cụm từ tương tự cho "huyền thoại trong điện toán" không?
IQAndreas

1
Tôi nghĩ rằng cụm từ là truyền thuyết đô thị ; Tôi chưa bao giờ nghe nói về huyền thoại đô thị . Xem en.wikipedia.org/wiki/Urban_legend Trong điện toán, cụm từ "sùng bái hàng hóa" có thể phù hợp.
derobert

Câu trả lời:


8

Có một sự thật về điều này, trên thực tế nhiều sự thật hơn huyền thoại, nhưng dù sao thì tuyên bố này phản ánh một sự hiểu lầm cơ bản về những gì đang diễn ra. Có, di chuyển chuột trong khi tạo khóa bằng GPG có thể là một ý tưởng hay. Có, di chuyển chuột đóng góp một số entropy làm cho số ngẫu nhiên ngẫu nhiên. Không, di chuyển chuột không làm cho khóa an toàn hơn.

Tất cả các trình tạo ngẫu nhiên tốt phù hợp với mật mã và Linux nằm trong danh mục đó, có hai thành phần:

  • Một nguồn entropy , không xác định. Mục đích của entropy là để bootstrap trình tạo số ngẫu nhiên với dữ liệu không thể đoán trước. Nguồn entropy phải không xác định: nếu không, một kẻ thù có thể tái tạo cùng một tính toán.
  • Trình tạo số giả ngẫu nhiên , tạo ra các số ngẫu nhiên không thể đoán trước theo kiểu xác định từ trạng thái nội bộ thay đổi.

Entropy phải đến từ một nguồn bên ngoài máy tính. Người dùng là một nguồn của entropy. Những gì người dùng làm hầu hết không phải là ngẫu nhiên, nhưng thời gian gõ phím và chuyển động chuột rất khó đoán là hơi ngẫu nhiên - không phải là rất ngẫu nhiên, nhưng từng chút một, nó tích lũy. Các nguồn entropy tiềm năng khác bao gồm thời gian của các gói mạng và nhiễu trắng của camera hoặc micrô. Các phiên bản và cấu hình kernel khác nhau có thể sử dụng một bộ nguồn khác nhau. Một số máy tính có các mạch RNG phần cứng chuyên dụng dựa trên sự phân rã phóng xạ hoặc, ít ấn tượng hơn, các mạch điện tử không ổn định. Các nguồn chuyên dụng này đặc biệt hữu ích trong các thiết bị và máy chủ nhúng có thể có hành vi khá dễ đoán trong lần khởi động đầu tiên của chúng mà không cần người dùng thực hiện những điều kỳ lạ.

Linux cung cấp số ngẫu nhiên cho các chương trình thông qua hai thiết bị: /dev/random/dev/urandom . Đọc từ một trong hai thiết bị trả về chất lượng mật mã. Cả hai thiết bị đều sử dụng cùng một trạng thái RNG bên trong và cùng một thuật toán để chuyển đổi trạng thái và tạo ra các byte ngẫu nhiên. Họ có những hạn chế đặc biệt khiến cả hai không phải là điều đúng:

  • /dev/urandom có thể trả về dữ liệu dự đoán nếu hệ thống chưa tích lũy đủ entropy.
  • /dev/randomtính toán số lượng entropy và khối có sẵn nếu không đủ. Điều này nghe có vẻ tốt, ngoại trừ việc tính toán dựa trên những cân nhắc về mặt lý thuyết làm cho lượng entropy có sẵn giảm tuyến tính với mỗi bit đầu ra. Do đó /dev/randomcó xu hướng chặn rất nhanh.

Các hệ thống Linux lưu trạng thái RNG nội bộ vào đĩa và khôi phục nó khi khởi động. Do đó, entropy chuyển từ khởi động này sang khởi động tiếp theo. Lần duy nhất khi một hệ thống Linux có thể thiếu entropy là khi nó được cài đặt mới. Một khi có đủ entropy trong hệ thống, entropy không giảm; chỉ tính toán thiếu sót của Linux giảm. Để giải thích thêm về việc xem xét này, đọc /dev/urandomlà phù hợp để tạo khóa mật mã , bởi một nhà mật mã học chuyên nghiệp. Xem aso Bạn có thể giải thích ước tính entropy được sử dụng trong Random.c .

Di chuyển chuột thêm entropy vào hệ thống. Nhưng gpg chỉ có thể đọc từ /dev/randomchứ không phải/dev/urandom (một cách để giải quyết vấn đề này là tạo /dev/randomcùng một thiết bị 1: 9 /dev/urandom), vì vậy nó không bao giờ có nguy cơ nhận được các số ngẫu nhiên không đủ ngẫu nhiên. Nếu bạn không di chuyển chuột, phím sẽ ngẫu nhiên nhất có thể; nhưng điều có thể xảy ra là gpg có thể bị chặn trong một lần đọc từ đó /dev/random, chờ cho bộ đếm entropy của kernel tăng lên.


Ngoại trừ các phiên bản hiện tại của linux, ít nhất là từ thử nghiệm của tôi, sử dụng các thiết bị đầu vào làm nguồn entropy (hoặc ít nhất là entropy ước tính). Tôi khá chắc chắn rằng họ đã thay đổi điều đó bởi vì về lý thuyết họ có thể nằm dưới sự kiểm soát của kẻ tấn công.
derobert

@derobert Tính đến 3.12 có một cuộc gọi đến add_input_randomnesstrong drivers/input/input.c, nhưng tôi không biết trong hoàn cảnh những gì nó sẽ entropy thực bơm.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đoán nó bổ sung entropy, nhưng với ước tính là 0 ... Tôi đã thử cả chuột USB và bàn phím PS / 2, dường như không tăng ước tính entropy. Tuy nhiên, không chắc chắn tại sao, như tôi thấy cuộc gọi đến credit_entropy_bits trong mã.
derobert

3

GPG đang sử dụng trình tạo số ngẫu nhiên Linux (kernel). Trình tạo nhân được entropy (tính ngẫu nhiên) từ tất cả các nơi, trong số đó là thời gian ngắt, đối với các ngắt nhất định. Di chuyển chuột (và gõ, hoạt động của đĩa, v.v.) sẽ tạo ra các ngắt.

Vì vậy, di chuyển chuột thực sự có khả năng cung cấp cho trình tạo số ngẫu nhiên. Nhưng liệu nó có phụ thuộc vào phiên bản kernel chính xác đang sử dụng hay không; các phiên bản mới hơn không (ít nhất là trong thử nghiệm của tôi) sử dụng các ngắt bàn phím hoặc chuột cho entropy. Tuy nhiên, hoạt động của đĩa thực hiện (vì vậy, ví dụ, việc chạy syncsẽ thêm một lượng entropy có khả năng lớn, tùy thuộc vào mức độ được xả).

Tóm lại: điều này không đúng trên các phiên bản Linux hiện tại. Đó là trên những người lớn tuổi.

Tuy nhiên, nếu trình tạo hết entropy, thì nó chỉ dừng lại vì vậy thế hệ khóa của bạn sẽ bị treo cho đến khi một số entropy được tạo. Vì vậy, nó sẽ là một vấn đề mất mãi mãi, không phải là vấn đề bảo mật.

Bạn có thể thấy bao nhiêu entropy có sẵn bằng cách cat /proc/sys/kernel/random/entropy_avail.


Cũng lưu ý rằng bạn có thể sử dụng các công cụ như rngdđể nuôi nhân tạo hồ bơi entropy.
Patrick

@Patrick thực sự, và nếu bạn có chip mới và tin tưởng NSA (ồ, chờ đã, ý tôi là, Intel) bạn có thể sử dụng RDRAND.
derobert

havegednó là một công cụ tốt khác để nuôi entropy pool nhân tạo.
mavillan

Đó không phải là câu chuyện hoàn chỉnh - RNG không hết entropy, nó hết biện pháp entropy bên trong. Ngoài ra, một phần quan trọng của câu đố là gpg không quan tâm đến con chuột, đó là hạt nhân.
Gilles 'SO- đừng trở nên xấu xa'

@Gilles Tôi đã làm rõ rằng gpg đang sử dụng Linux RNG. Và các lỗi trong công cụ ước tính entropy dường như vượt quá phạm vi.
derobert

0

Tails có thế hệ khóa cực nhanh vì nó đã havegedđược cài đặt:

sudo apt-get install haveged
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.