Entropi sadece üzerinden kaybolmaz /dev/{,u}random
, çekirdek de biraz alır. Örneğin, yeni işlemler rastgele adreslere (ASLR) sahiptir ve ağ paketleri rastgele sıra numaralarına ihtiyaç duyar. Dosya sistemi modülü bile bazı entropileri kaldırabilir. Sürücüler / char / random.c'deki yorumlara bakın . Ayrıca entropy_avail
, giriş havuzlarına atıfta bulunur , çıkış havuzlarına değil (temel olarak engellememe /dev/urandom
ve engelleme /dev/random
).
Entropi havuzunu izlemeniz gerekiyorsa, kullanmayın watch cat
, bu her çağrışımda entropi tüketir cat
. Geçmişte de GPG anahtar üretmede çok yavaş olduğu için bu havuzu izlemek istedim, bu nedenle entropi havuzunu izlemek için tek amacı olan bir C programı yazdım: https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c .
Entropiyi de tüketen arka plan süreçleri olabileceğini unutmayın. İzleme noktalarını uygun bir çekirdeğe kullanarak entropi havuzunu değiştiren işlemleri görebilirsiniz. Kendi işlemini yok saymak ( ) ve zaman damgaları ( ) dahil olmak üzere 1 saniye sonra ölçüme başlayarak -g
tüm CPU'larda ( -a
) callchain ( ) dahil rastgele alt sistemle ilgili tüm izleme noktalarını kaydeden örnek kullanım :-D 1000
-T
sudo perf record -e random:\* -g -a -D 1000 -T sleep 60
Bu komutlardan herhangi biriyle okuyun (sahibini perf.data
gerektiği gibi değiştirin ):
perf report # opens an interactive overview
perf script # outputs events after each other with traces
perf script
Entropi 8 bayt (64 bit) hakkında periyodik olarak benim makinede boşaltıldığında çıktı ilginç bir kavrayış ve gösteriler verir:
kworker / 0: 2 193 3292.235908: rasgele: ekstrakt_entropi: ffffffff8173e956 havuz: nbytes 8 entropy_count 921 arayan _xfer_seincil_pool
5eb857 özü_entropisi (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
5eb984 _xfer_seincil_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
5ebae6 push_to_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
293a05 process_one_work (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
293ce8 worker_thread (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
299998 kthread (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
7c7482 ret_from_fork (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
kworker / 0: 2193 3292.235911: rasgele: debit_entropi: ffffffff8173e956: debit_bits 64
5eb3e8 hesabı.part.12 (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
5eb770 özü_entropisi (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
5eb984 _xfer_seincil_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
5ebae6 push_to_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
293a05 process_one_work (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
293ce8 worker_thread (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
299998 kthread (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
7c7482 ret_from_fork (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
...
takas 0 3292.507720: rasgele: credit_entropy_bits: ffffffff8173e956 havuz: bit 2 entropy_count 859 entropy_total 2 arayan add_interrupt_randomness
5eaab6 credit_entropy_bits (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
5ec644 add_interrupt_randomness (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
2d5729 handle_irq_event_percpu (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
2d58b9 handle_irq_event (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
2d8d1b handle_edge_irq (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
230e6a handle_irq (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
7c9abb do_IRQ (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
7c7bc2 ret_from_intr (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
6756c7 cpuidle_enter (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
2bd9fa call_cpuidle (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
2bde18 cpu_startup_entry (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
2510e5 start_seincil (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
Görünüşe göre bu, entropiyi giriş havuzundan çıkış havuzlarına aktararak entropinin israfını önlemek için olur:
/*
* Credit (or debit) the entropy store with n bits of entropy.
* Use credit_entropy_bits_safe() if the value comes from userspace
* or otherwise should be checked for extreme values.
*/
static void credit_entropy_bits(struct entropy_store *r, int nbits)
{
...
/* If the input pool is getting full, send some
* entropy to the two output pools, flipping back and
* forth between them, until the output pools are 75%
* full.
*/
...
schedule_work(&last->push_work);
}
/*
* Used as a workqueue function so that when the input pool is getting
* full, we can "spill over" some entropy to the output pools. That
* way the output pools can store some of the excess entropy instead
* of letting it go to waste.
*/
static void push_to_pool(struct work_struct *work)
{
...
}
/dev/random
sonuçta, güvenli kriptografik amaçlar için kullanılan bir şeydir ve uygulama saf olmayı göze alamaz. Buradaki son noktada bir açıklamaya değinilebilir: en.wikipedia.org/wiki/Entropy_pool#Using_observed_events ("Anahtarlı bir akış şifresini koru ve Başlatma vektörü ...") ile başlayarak -> havuz yeterli olduğunda değiştirilir veriler birikmiştir.