Jeśli tak, to watch cat /proc/sys/kernel/random/entropy_avail
widzę, że entropia moich systemów z czasem powoli rośnie, aż osiągnie zakres 180-190, w którym to momencie spada do około 120-130. Krople w entropii zdają się pojawiać co około dwadzieścia sekund. Obserwuję to, nawet gdy lsof
mówi, że żaden proces nie został otwarty /dev/random
lub /dev/urandom
otwarty. Co drenuje entropię? Czy jądro również potrzebuje entropii, czy może przetwarza większą pulę w mniejszą, lepszej jakości?
To jest na komputerze bez systemu operacyjnego, bez połączeń SSL / SSH / WPA.
/dev/random
jest przecież czymś, co jest wykorzystywane do bezpiecznych celów kryptograficznych, a implementacja nie może być naiwna. Jednym z wyjaśnień może być wskazany w ostatnim punkcie tutaj: en.wikipedia.org/wiki/Entropy_pool#Using_observed_events (zaczynając od „Zachowaj szyfr strumienia za pomocą klucza i wektora inicjalizacji ...”) -> pula jest zastępowana, ilekroć wystarczająca dane się zgromadziły./dev/random
jest dość fałszywe - gdy raz pula entropii zostanie zapełniona,/dev/urandom
jest równie dobra jak/dev/random
.Odpowiedzi:
Entropia jest nie tylko tracona przez
/dev/{,u}random
jądro, ale także i jądro. Na przykład nowe procesy mają adresy losowe (ASLR), a pakiety sieciowe potrzebują losowych numerów sekwencji. Nawet moduł systemu plików może usunąć trochę entropii. Zobacz komentarze w drivers / char / random.c . Zauważ też, żeentropy_avail
odnosi się to do puli wejściowej , a nie pul wyjściowych (w zasadzie nieblokujący/dev/urandom
i blokujący/dev/random
).Jeśli chcesz obserwować pulę entropii, nie używaj
watch cat
, ponieważ zużyje ona entropii przy każdym wywołaniucat
. W przeszłości chciałem również oglądać tę pulę, ponieważ GPG bardzo wolno generowała klucze, dlatego napisałem program C, którego jedynym celem było obejrzenie puli entropii: https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c .Zauważ, że mogą istnieć procesy w tle, które również zużywają entropię. Używając tracepoints na odpowiednim jądrze, możesz zobaczyć procesy modyfikujące pulę entropii. Przykładowe użycie, które rejestruje wszystkie punkty śledzenia związane z losowym podsystemem, w tym callchain (
-g
) na wszystkich procesorach (-a
), rozpoczynając pomiar po 1 sekundzie w celu zignorowania własnego procesu (-D 1000
) i włączając znaczniki czasu (-T
):Przeczytaj to za pomocą jednego z poniższych poleceń (w
perf.data
razie potrzeby zmień właściciela ):Dane
perf script
wyjściowe dają ciekawy wgląd i pokazują, kiedy około 8 bajtów (64 bitów) entropii jest okresowo usuwanych z mojej maszyny:Najwyraźniej dzieje się tak, aby zapobiec marnowaniu entropii, przenosząc entropię z puli wejściowej do pul wyjściowych:
źródło
watch
) rośnie równomiernie, a następnie gwałtownie spada. Jeśli zostaniewatch
zużyta entropia przy każdym czytaniu, powinna się stopniowo zmniejszać.cat
powinno teoretycznie mieć taki sam odpływ entropii, który nie powinien być widoczny. Okazuje się, że entropia jest przenoszona do innej puli, gdy jest „wystarczająca” entropia.lsof nie jest najlepszym narzędziem do monitorowania,
/dev/random
ponieważ proces odczytu kończy się w bardzo krótkim czasie. Nie znam dobrej metody uzyskiwania informacji o tym, co robi proces odczytu, ale za jego pomocąinotify
można monitorować, czy istnieje odczyt.Oto w zasadzie dwa sposoby:
Uzyskaj podsumowanie po N sekundach dzięki:
Zobacz wydarzenia z dostępem na żywo :
Żaden nie da ci procesu, a ten drugi nie da ci rozmiaru do przeczytania. Pierwszy daje podsumowanie jak w:
Jeśli masz to uruchomione i zrób to
dd if=/dev/random of=/tmp/foo bs=1 count=3
, masz pomysł.W każdym razie. Nie da ci to tyknięć, gdy jądro zużyje się z puli.
Jeśli chodzi o sprawdzanie stanu entropii za pomocą
nie jest najlepszym pomysłem, ponieważ każdy
cat
z nich pochłonie entropię. (Widzę, że pojawiła się kolejna odpowiedź, która również o tym wspomina.) Mam też do tego trochę kodu C i próbowałem go wczoraj znaleźć. Zobaczę, czy mogę to znaleźć i zaktualizować odpowiedź później.źródło
/dev/random
(wiem, że na tej stronie są podobne przykłady).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); }