Często używam polecenia
cat /dev/urandom | strings --bytes 1 | tr -d '\n\t ' | head --bytes 32
generować pseudolosowe hasła. To nie działa z /dev/random
.
konkretnie
cat /dev/urandom | strings --bytes 1 | tr -d '\n\t '
produkuje dane wyjściowecat /dev/random | strings --bytes 1
produkuje dane wyjściowecat /dev/random | strings --bytes 1 | tr -d '\n\t '
nie wytwarza wyników
Uwaga: Podczas używania /dev/random
może być konieczne poruszanie myszą lub naciskanie klawiszy (np. Ctrl, Shift itp.), Aby wygenerować entropię.
Dlaczego ostatni przykład nie działa? Czy tr
ma jakiś duży wewnętrzny bufor, który /dev/urandom
szybko się zapełnia, ale /dev/random
nie?
PS Używam CentOS 6.5
cat /proc/version
Linux version 2.6.32-431.3.1.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Jan 3 21:39:27 UTC 2014
pwgen
w szczególnościpwgen -s
?-s
Przełącznik czyni je mniej zapamiętania, bardziej prawdziwie losowych. @Boyd: czy makepasswd jest szeroko dostępny poza dystrybucjami opartymi na Debianie? Z mojego punktu widzenia pwgen jest dostępny dla CentOS, podczas gdy makepasswd nie .makepasswd
nie jest dostępny na mojej platformie, mimo wszystko dziękiOdpowiedzi:
W końcu to nastąpi.
W:
cat
nigdy nie buforuje, ale i tak jest zbędny, ponieważ nie ma tu nic do połączenia.strings
jednak ponieważ jego sygnał wyjściowy nie jest już dłużej, terminal buforuje dane wyjściowe o bloki (czegoś w rodzaju 4 lub 8 kB), w przeciwieństwie do linii, gdy dane wyjściowe trafiają do terminala.Zacznie więc zapisywać na standardowe wyjście, gdy zgromadzi znaki o wartości 4kB do wydania, co
/dev/random
zajmie trochę czasu.tr
dane wyjściowe trafiają do terminala (jeśli uruchamiasz go w wierszu poleceń powłoki w terminalu), więc buforuje dane wyjściowe liniowo. Ponieważ usuwasz\n
, nigdy nie będzie miał pełnej linii do zapisu, więc zamiast tego zapisze, gdy tylko pełny blok zostanie zgromadzony (na przykład, gdy wyjście nie trafi do terminala).Tak więc,
tr
nie jest prawdopodobne, aby napisać coś ażstrings
przeczytał wystarczająca/dev/random
, tak aby napisać 8kB (2 bloki prawdopodobnie wiele innych) danych (ponieważ pierwszy blok będzie prawdopodobnie zawierać pewne przełamane lub TAB lub przestrzeni znaków).W tym systemie, w którym próbuję tego, mogę uzyskać średnio 3 bajty na sekundę
/dev/random
(w przeciwieństwie do 12 Mb na/dev/urandom
), więc w najlepszym przypadku (pierwsze 4096 bajtów/dev/random
to wszystkie do wydrukowania), jesteśmy rozmowa 22 minuty przed tym, jaktr
zaczyna coś wydawać. Ale najprawdopodobniej będą to godziny (w szybkim teście widzęstrings
pisanie bloku co 1 do 2 odczytanych bloków, a bloki wyjściowe zawierają około 30% znaków nowego wiersza, więc spodziewam się, że będzie musiał przeczytać co najmniej 3 bloki wcześniejtr
ma 4096 znaków do wydrukowania).Aby tego uniknąć, możesz:
stdbuf
to polecenie GNU (występujące również w niektórych BSD), które zmienia buforowanie poleceń stdio za pomocą lewy LD_PRELOAD.Zauważ, że zamiast
strings
możesz użyć,tr -cd '[:graph:]'
co spowoduje również wykluczenie tabulacji, nowej linii i spacji.Możesz także poprawić ustawienia regionalne, aby
C
uniknąć przyszłych niespodzianek ze znakami UTF-8.źródło
cat
„bezużytecznego”, ponieważ nigdy nie lubiłem przekierowywać stdin na końcu potoku, teraz mogę „zapisać proces” i nadal mieć czytelne polecenia. Moje ostateczne rozwiązanie to< /dev/random stdbuf -o0 tr -Cd '[:graph:]' | stdbuf -o0 head --bytes 32
[:graph:]
. Zapomniałem o tym.stdbuf
dlahead -c32
chyba że chcesz, aby to zapisywać dane tak szybko, jak to ma go (podobnie jak w kilku kawałkach, zamiast jednego kawałka 32byte jak tylko dostał je)Generowanie liczb losowych dla wielu aplikacji bezpieczeństwa wymaga wystarczającej entropii - entropia mierzy, jak nieprzewidywalna jest losowość. Procesor deterministyczny nie może wygenerować entropii, więc entropia musi pochodzić z zewnątrz - albo ze składnika sprzętowego o niedeterministycznym zachowaniu, albo z innych czynników, które są wystarczająco trudne do odtworzenia, takich jak czas działania użytkownika (to tam, gdzie porusza się mysz wchodzi). Gdy dostępna jest wystarczająca entropia, można zastosować kryptografię do wygenerowania praktycznie nieograniczonego strumienia liczb losowych.
Linux działa poprzez gromadzenie entropii w puli, a następnie za pomocą kryptografii do generowania akceptowalnych liczb losowych zarówno przez, jak
/dev/random
i przez/dev/urandom
. Różnica polega na tym, że/dev/random
stosuje się wyjątkowo konserwatywne obliczenia entropii, które zmniejszają oszacowanie entropii w puli dla każdego generowanego bajtu, a/dev/urandom
nie dotyczą samej ilości entropii w puli.Jeśli oszacowanie entropii w puli jest zbyt niskie,
/dev/random
blokuje się, aż można akumulować więcej entropii. Może to poważnie osłabić szybkość, z jaką/dev/random
może wytwarzać produkcję. To właśnie tutaj obserwujesz. Nie ma to nic wspólnegotr
; alestrings
odczytuje dane wyjściowe z buforowaniem, więc musi odczytać pełny bufor (kilka KB),/dev/random
aby wygenerować przynajmniej jeden bajt danych wejściowych./dev/urandom
jest całkowicie akceptowalny do generowania klucza kryptograficznego , ponieważ entropia w rzeczywistości nie zmniejsza się w żaden zauważalny sposób. (Jeśli utrzymujesz swoją maszynę dłużej niż wszechświat istniał, nie możesz zaniedbać tych rozważań, ale poza tym jesteś dobry.) Jest tylko jeden przypadek, w którym/dev/urandom
nie jest dobry, czyli na świeżo zainstalowanym systemie, który nie ma nie miał jeszcze czasu na wygenerowanie entropii lub świeżo uruchomionego systemu, który uruchamia się z nośnika tylko do odczytu.Wyeliminowanie
strings
z łańcucha rozruchowego prawdopodobnie przyspieszy proces. Poniżejtr
filtrowane są znaki niedrukowalne:Ale można użyć
/dev/urandom
tutaj , tak długo, jak zadbać, aby nie generować hasła w systemie, który nie miał czasu, aby zgromadzić wystarczającą entropię. Możesz sprawdzić poziom puli entropii Linuksa w/proc/sys/kernel/random/entropy_avail
(jeśli użyjesz/dev/random
, liczba w tym pliku będzie konserwatywna, być może bardzo).źródło
Powinieneś użyć,
/dev/urandom
aby uzyskać wysokiej jakości (pseudo) liczby losowe i/dev/random
tylko wtedy, gdy absolutnie potrzebujesz liczb losowych, które są naprawdę nieprzewidywalne. Atakujący poniżej zasobów NSA będzie miał bardzo trudny do złamania/dev/urandom
(i nie zapomnij o kryptografii węża gumowego ). Jądro wypełnia bufor „naprawdę losowymi” bajtami, co/dev/random
daje. Niestety tempo, w jakim te są generowane jest niska, więc przeczytaniu wielu zz/dev/random
będzie stoisko czeka na przypadkowości.Możesz rozważyć użycie random.org lub jego generatora haseł lub jednego z wielu, wielu losowych generatorów haseł, które się zmieniają, spójrz np. Na tę stronę, aby uzyskać kilka wskazówek z wiersza poleceń (nie polecam wszystkich z nich , ale powinny dać ci pomysły), lub możesz użyć czegoś takiego
mkpasswd(1)
(tutaj w części Fedora 19expect-5.45-8.fc19.x86_64
).źródło