RANDOM(4)

NAZWA
random, urandom - urządzenia źródłowe liczb losowych jądra

OPIS
Specjalne urządzenia znakowe /dev/random i /dev/urandom (obecne w Linuksie od wersji 1.3.30) stanowią interfejs do wbudowanego w jądro generatora liczb losowych. Plik /dev/random ma główny numer urządzenia 1 i poboczny numer 8. Plik /dev/urandom ma główny numer urządzenia 1 i poboczny numer 9.

Generator liczb losowych zbiera szum środowiskowy ze sterowników urządzeń i innych źródeł do puli losowej. Generator przechowuje również szacunkową liczbę bitów szumu w puli losowej. Z owej puli tworzone są liczby losowe.

W trakcie odczytu, urządzenie /dev/random będzie zwracać losowe bajty, spośród oszacowanej liczby bitów szumu w puli. /dev/random nadaje się najlepiej do zastosowań, w których potrzebna jest losowość bardzo wysokiej jakości, jak np. jednorazowa maska lub generowanie kluczy. Jeśli pula losowa jest pusta, odczyt z /dev/random będzie wstrzymany do czasu zebrania dodatkowego szumu środowiskowego.

Odczyt z urządzenia /dev/urandom zwróci tyle bajtów, ile zażądano. W efekcie, jeśli nie ma wystarczającego chaosu w puli losowej, zwracane wartości są teoretycznie narażone na atak kryptograficzny w stosunku do algorytmów wykorzystywanych przez sterownik. Wiedza na ten temat nie jest dostępna w obecnych nie zastrzeżonych publikacjach, ale istnieje teoretyczna możliwość przeprowadzenia takiego ataku. Jeśli jest to problemem w przypadku twojego programu, użyj /dev/random.

KONFIGURACJA
Jeśli w systemie nie ma plików /dev/random i /dev/urandom, można je utworzyć przy użyciu następujących poleceń:
        mknod -m 644 /dev/random c 1 8
        mknod -m 644 /dev/urandom c 1 9
        chown root:root /dev/random /dev/urandom
Gdy Linux uruchamiany jest przy niewielkim udziale operatora, pula losowa może być w dość przewidywalnym stanie. Faktyczna ilość szumu w puli losowej jest wówczas poniżej ilości szacowanej. Aby przeciwdziałać temu efektowi, pomocne jest zapamiętywanie informacji o puli losowej pomiędzy kolejnymi uruchomieniami systemu. Aby działo się to automatycznie, należy dodać następujące wiersze do stosownych skryptów startowych Linuksa:
	echo "Inicjowanie generatora liczb losowych w jądrze..."
	random_seed=/var/run/random-seed
	# Przechowanie wartości losowej od jednego startu systemu
	# do kolejnego startu. Ładujemy, a potem zachowujemy całą
	# pulę losową.
	if [ -f $random_seed ]; then
	    cat $random_seed >/dev/urandom
	else
	    touch $random_seed
	fi
	chmod 600 $random_seed
	poolfile=/proc/sys/kernel/random/poolsize
	[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
	dd if=/dev/urandom of=$random_seed count=1 bs=$bytes
Trzeba również dodać następujące wiersze do stosownego skryptu uruchamianego podczas zamykania systemu Linuksa:
 	# Przechowanie losowych danych pomiędzy wyłączeniem a wyłą-
	# czeniem komputera. Zachowywanie puli losowej generatora.
 	echo "Zachowywanie danych losowych..."
	random_seed=/var/run/random-seed
	touch $random_seed
	chmod 600 $random_seed
	poolfile=/proc/sys/kernel/random/poolsize
	[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
	dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

INTERFEJS PROC
Pliki w katalogu /proc/sys/kernel/random (obecnym od wersji 2.3.16) są dodatkowym intefejsem do urządzenia /dev/random.

Plik z prawami tylko do odczytu entropy_avail dostarcza dostępną pulę losową. Zazwyczaj będzie to 4096 (bitów), całość dostępnej puli.

Plik poolsize podaje rozmiar puli losowej. Zazwyczaj - 512 (bajtów). Może być zmienione na dowolną wartość, dla której dostępny jest algorytm. Obecnie możliwe wartości to: 32, 64, 128, 256, 512, 1024, 2048.

Plik read_wakeup_threshold zawiera liczbę bitów entropii potrzebnej do obudzenia procesu, który zasnął, czekając na entropię z pliku /dev/random. Domyślnie - 64. Plik write_wakeup_threshold zawiera liczbę bitów entropii poniżej której zostanie uśpiony proces, który wykona select() lub poll(), aby otworzyć do zapisu urządzenie /dev/random. Wartości te mogą być zmienione przez zapis do tych plików.

Pliki tylko do odczytu uuid i boot_id zawierają losowe łańcuchy znaków, takie jak 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9. Pierwszy z tych plików jest generowany na nowo przy każdym odczycie, a drugi jest generowany tylko raz.

PLIKI
/dev/random
/dev/urandom

AUTOR
Generator liczb losowych w jądrze został napisany przez Theodore'a Ts'o (tytso@athena.mit.edu).

ZOBACZ TAKŻE
mknod (1)
RFC 1750, "Randomness Recommendations for Security" (Zalecenia dotyczące bezpieczeństwa losowości)