엔트로피는를 통해 잃어 버릴뿐만 아니라 /dev/{,u}random
커널도 필요합니다. 예를 들어, 새로운 프로세스에는 ASLR (Randomized Address)이 있으며 네트워크 패킷에는 임의의 시퀀스 번호가 필요합니다. 파일 시스템 모듈조차도 일부 엔트로피를 제거 할 수 있습니다. drivers / char / random.c 의 주석을 참조하십시오 . 또한 출력 풀이 아닌 entropy_avail
입력 풀 (기본적으로 비 차단 /dev/urandom
및 차단 /dev/random
)을 참조하십시오.
엔트로피 풀을 볼 필요가있는 경우를 사용하지 마십시오 .를 watch cat
호출 할 때마다 엔트로피가 소비됩니다 cat
. 과거에는 GPG가 키 생성 속도가 매우 느리기 때문에이 풀을보고 싶었습니다. 따라서 엔트로피 풀을보기위한 유일한 목적으로 C 프로그램을 작성했습니다 : https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c .
엔트로피를 소비하는 백그라운드 프로세스가있을 수 있습니다. 적절한 커널에서 추적 점을 사용하면 엔트로피 풀을 수정하는 프로세스를 볼 수 있습니다. 1 초 후에 측정을 시작하여 자체 프로세스 ( ) 를 무시하고 타임 스탬프 ( )를 포함하여 -g
모든 CPU ( -a
) 에서 콜 체인 ( )을 포함하여 임의 서브 시스템과 관련된 모든 추적 점을 기록하는 사용법 예 :-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 : 랜덤 : 추출 _ 엔트로피 : 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 account.part.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)
...
스왑 퍼 0 [002] 3292.507720 : 랜덤 : credit_entropy_bits : ffffffff8173e956 풀 : 비트 2 entropy_count 859 entropy_total 2 호출자 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_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가 (로 시작하는 "키와 초기화 벡터와 스트림 암호를 유지 ...") -> 풀입니다 교체 할 때마다 충분히 데이터가 축적되었습니다.