เอนโทรปีไม่ได้หายไปเพียงอย่างเดียวผ่านทาง/dev/{,u}random
เคอร์เนลยังใช้เวลาบางส่วน ตัวอย่างเช่นกระบวนการใหม่มีที่อยู่แบบสุ่ม (ASLR) และแพ็คเก็ตเครือข่ายต้องการหมายเลขลำดับแบบสุ่ม แม้โมดูลระบบไฟล์อาจลบเอนโทรปีบางส่วน ดูความคิดเห็นในไดรเวอร์ / ถ่าน / random.c โปรดทราบด้วยว่าentropy_avail
หมายถึงพูลข้อมูลไม่ใช่พูลเอาต์พุต (โดยทั่วไปคือไม่มีการบล็อก/dev/urandom
และบล็อก/dev/random
)
หากคุณต้องการที่จะดูสระว่ายน้ำเอนโทรปีไม่ได้ใช้ว่าจะใช้เอนโทรปีในการภาวนาของทุกwatch cat
cat
ในอดีตฉันยังต้องการดูพูลนี้เนื่องจาก GPG ช้ามากในการสร้างคีย์ดังนั้นฉันจึงเขียนโปรแกรม C โดยมีจุดประสงค์เพียงอย่างเดียวเพื่อดูพูลเอนโทรปี: https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c
โปรดทราบว่าอาจมีกระบวนการพื้นหลังที่ใช้เอนโทรปี การใช้ tracepoints บนเคอร์เนลที่เหมาะสมคุณสามารถเห็นกระบวนการที่ปรับเปลี่ยนพูลเอนโทรปี ตัวอย่างการใช้งานที่บันทึกจุดติดตามทั้งหมดที่เกี่ยวข้องกับระบบย่อยแบบสุ่มรวมถึง callchain ( -g
) บน CPUs ทั้งหมด ( -a
) เริ่มการวัดหลังจาก 1 วินาทีเพื่อเพิกเฉยต่อกระบวนการของตัวเอง ( -D 1000
) และรวมถึงการประทับเวลา ( -T
):
sudo perf record -e random:\* -g -a -D 1000 -T sleep 60
อ่านด้วยคำสั่งเหล่านี้ (เปลี่ยนเจ้าของได้perf.data
ตามต้องการ):
perf report # opens an interactive overview
perf script # outputs events after each other with traces
perf script
เอาท์พุทให้ข้อมูลเชิงลึกที่น่าสนใจและแสดงให้เห็นว่าเมื่อประมาณ 8 ไบต์ (64 บิต) ของเอนโทรปีเป็นเนื้อเป็นระยะ ๆ ในเครื่องของฉัน:
kworker / 0: 2 193 [000] 3292.235908: random: extract_entropy: ffffffff8173e956 พูล: nbytes 8 entropy_count 921ผู้เรียก _xfer_secondary_pool
5eb857 extract_entropy (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
5eb984 _xfer_secondary_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: 2 193 [000] 3292.235911: สุ่ม: debit_entropy: ffffffff8173e956: debit_bits 64
5eb3e8 บัญชีส่วนที่ 12 (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
5eb770 extract_entropy (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
5eb984 _xfer_secondary_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)
...
swapper 0 [002] 3292.507720: random: credit_entropy_bits: ffffffff8173e956 พูล: bits 2 entropy_count 859 entropy_total 2 ผู้โทร
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_secondary (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
เห็นได้ชัดว่าสิ่งนี้เกิดขึ้นเพื่อป้องกันไม่ให้เสียเอนโทรปีโดยการโอนเอนโทรปีจากสระว่ายน้ำไปยังสระว่ายน้ำเอาท์พุท:
/*
* 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
คือบางสิ่งที่ใช้เพื่อจุดประสงค์ด้านการเข้ารหัสลับที่ปลอดภัยและการนำไปปฏิบัตินั้นไม่สามารถไร้เดียงสาได้ คำอธิบายหนึ่งอาจเป็นนัยในจุดสุดท้ายที่นี่: en.wikipedia.org/wiki/Entropy_pool#Using_observed_events (เริ่มต้นด้วย "รักษารหัสกระแสด้วยคีย์และเวกเตอร์เริ่มต้น ... ") -> สระว่ายน้ำถูกแทนที่เมื่อใดก็ตามที่เพียงพอ ข้อมูลได้สะสม