Jika saya lakukan, watch cat /proc/sys/kernel/random/entropy_avail
saya melihat bahwa sistem saya entropi perlahan-lahan meningkat dari waktu ke waktu, sampai mencapai kisaran 180-190 di mana titik itu turun menjadi sekitar 120-130. Penurunan entropi tampaknya terjadi setiap dua puluh detik. Saya mengamati bahkan ini ketika lsof
mengatakan bahwa tidak ada proses memiliki /dev/random
atau /dev/urandom
terbuka. Apa yang menguras entropi? Apakah kernel juga perlu entropi, atau mungkin sedang memproses ulang pool yang lebih besar menjadi pool yang lebih kecil dan berkualitas lebih baik?
Ini pada mesin bare-metal, tanpa koneksi SSL / SSH / WPA.
/dev/random
Bagaimanapun, adalah sesuatu yang digunakan untuk tujuan kriptografi yang aman, dan implementasinya tidak bisa naif. Satu penjelasan mungkin diisyaratkan pada poin terakhir di sini: en.wikipedia.org/wiki/Entropy_pool#Using_observed_events (dimulai dengan "Mempertahankan stream cipher dengan kunci dan vektor Inisialisasi ...") -> kolam diganti setiap kali cukup data telah terakumulasi./dev/random
cukup banyak - setelah kumpulan entropi telah penuh satu kali,/dev/urandom
sama baiknya/dev/random
.Jawaban:
Entropi tidak hanya hilang melalui
/dev/{,u}random
, kernel juga membutuhkan beberapa. Misalnya, proses baru memiliki alamat acak (ASLR) dan paket jaringan memerlukan nomor urut acak. Bahkan modul sistem file dapat menghapus beberapa entropi. Lihat komentar di driver / char / random.c . Perhatikan juga yangentropy_avail
merujuk pada kumpulan input , bukan kumpulan output (pada dasarnya non-blocking/dev/urandom
dan blocking/dev/random
).Jika Anda perlu menonton kumpulan entropi, jangan gunakan
watch cat
, yang akan mengkonsumsi entropi di setiap doacat
. Di masa lalu saya juga ingin menonton pool ini karena GPG sangat lambat dalam menghasilkan kunci, oleh karena itu saya menulis sebuah program C dengan tujuan tunggal untuk menonton pool entropi: https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c .Perhatikan bahwa mungkin ada proses latar belakang yang juga mengonsumsi entropi. Menggunakan tracepoint pada kernel yang sesuai, Anda dapat melihat proses yang memodifikasi kumpulan entropi. Contoh penggunaan yang mencatat semua tracepoint yang terkait dengan subsistem acak termasuk callchain (
-g
) pada semua CPU (-a
) mulai mengukur setelah 1 detik untuk mengabaikan prosesnya sendiri (-D 1000
) dan termasuk cap waktu (-T
):Bacalah dengan salah satu dari perintah ini (ganti pemilik
perf.data
sesuai kebutuhan):The
perf script
Output memberikan wawasan yang menarik dan menunjukkan ketika sekitar 8 byte (64 bit) entropi secara berkala dikeringkan pada mesin saya:Tampaknya ini terjadi untuk mencegah pemborosan entropi dengan mentransfer entropi dari kumpulan input ke kumpulan keluaran:
sumber
watch
) tumbuh mantap kemudian turun tajam. Jikawatch
dikonsumsi entropi pada setiap bacaan, itu seharusnya benar-benar berkurang terus.cat
harus dalam teori memiliki saluran entropi yang sama yang seharusnya tidak terlihat. Ternyata entropi dipindahkan ke kumpulan yang berbeda ketika ada entropi "cukup".lsof bukan alat terbaik ke monitor
/dev/random
sebagai salah satu dibaca oleh suatu proses adalah lebih dalam yang sangat waktu singkat. Saya tidak tahu metode yang bagus untuk mendapatkan proses membaca, tetapi menggunakaninotify
Anda dapat memonitor jika ada membaca.Di sini pada dasarnya ada dua cara:
Dapatkan ringkasan setelah N detik dengan:
Lihat acara akses langsung :
Tidak akan memberi Anda proses dan yang terakhir tidak akan memberi Anda ukuran membaca. Yang pertama akan memberi Anda ringkasan seperti pada:
Jika Anda menjalankan dan melakukan itu
dd if=/dev/random of=/tmp/foo bs=1 count=3
, Anda mendapatkan idenya.Bagaimanapun. Ini tidak akan memberi Anda kutu ketika kernel mengkonsumsi dari pool.
Ketika datang untuk memeriksa status menggunakan entropi
bukan ide terbaik karena masing-masing
cat
akan mengkonsumsi entropi. (Saya melihat sekarang muncul jawaban lain yang juga menyebutkan ini.) Saya juga punya beberapa kode C untuk ini dan mencoba untuk menemukannya kemarin. Saya akan melihat apakah saya dapat menemukannya dan memperbarui jawaban nanti.sumber
/dev/random
(saya tahu ada contoh serupa di situs ini).watch cat
:use Fcntl 'SEEK_SET'; open(my $fh,"<", "/proc/sys/kernel/random/entropy_avail"); while (1) { print <$fh>; sleep(1); seek($fh,0,SEEK_SET); }