Vypadá obrázek zmateně? Ano, obsahuje totiž „entropii“. Entropie, v pojetí informačních technologií množství náhodných dat, je důležitým vstupem pro mnoho kryptografických algoritmů, které zajišťují bezpečný přenos nejrůznějších informací. Dostatečný počet a kvalita „neurčitosti“ se také přímo podílí na schopnosti zachycené šifrované informace nějakým způsobem prolomit. Ač se zdá jednoduché tato náhodná data získat, v některých případech je lze matematickým výpočtem zpětně zjistit. V prostředí ICT je proto jednou z nejdůležitějších úloh nashromáždit co největší množství kvalitní entropie, která může být následně využita, a kterou žádným způsobem nelze predikovat nebo dopočítat.V zásadě může být entropie generována softwarově zjišťováním stavů určitých zařízení a registrů, tzv. softwarovými generátory náhodných čísel, nebo hardwarově speciálními čipy či bloky procesorů. Někdy se však dostaneme do situace kdy zjistíme, že naše náhodná data nejsou tak úplně náhodná.
V GNU/Linux můžeme entropii získávat nejčastěji čtením zařízení /dev/random
a /dev/urandom
. Pokud máme k dispozici hardwarovou podporu, je dalším možným zdrojem /dev/hwrng
, případně jiné podobné zařízení.
Dostupné množství entropie získáme čtením souboru /proc/sys/kernel/random/entropy_avail
:
1 2 |
[root@linux ~]# cat /proc/sys/kernel/random/entropy_avail 2191 |
Jakékoli číslo menší než 1000 udává, že nemáme entropie dostatek a můžeme se v případě větších požadavků dostat do situace, kdy algoritmus, který náhodná data vyžaduje, bude na potřebné množství čekat. Toho si můžeme povšimnout například na WiFi AP, kdy se nám sníží datová propustnost. Důvodem nemusí být kvalita nebo síla WiFi signálu, ale právě nedostatek náhodných dat, které se uplatňují při šifrování přenosu WEP/WPA.
Dlouhou dobu se pro práci s generátory náhodných čísel/dat používají nástroje rng-tools
.
Pokud si chceme otestovat entropii dle FIPS 140-2, použijeme nástroj rngtest
:
Hardwarové zařízení /dev/hwrng
(součástí Raspberry Pi):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[root@linux ~]# cat /dev/hwrng | rngtest -c 1000 rngtest 5 Copyright (c) 2004 by Henrique de Moraes Holschuh This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. rngtest: starting FIPS tests... rngtest: bits received from input: 20000032 rngtest: FIPS 140-2 successes: 1000 rngtest: FIPS 140-2 failures: 0 rngtest: FIPS 140-2(2001-10-10) Monobit: 0 rngtest: FIPS 140-2(2001-10-10) Poker: 0 rngtest: FIPS 140-2(2001-10-10) Runs: 0 rngtest: FIPS 140-2(2001-10-10) Long run: 0 rngtest: FIPS 140-2(2001-10-10) Continuous run: 0 rngtest: input channel speed: (min=16.192; avg=936.980; max=2790178.571)Kibits/s rngtest: FIPS tests speed: (min=656.270; avg=24684.387; max=37778.046)Kibits/s rngtest: Program run time: 22756335 microseconds |
Zařízení /dev/random
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[root@linux ~]# cat /dev/random | rngtest -c 1000 rngtest 5 Copyright (c) 2004 by Henrique de Moraes Holschuh This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. rngtest: starting FIPS tests... rngtest: bits received from input: 20000032 rngtest: FIPS 140-2 successes: 998 rngtest: FIPS 140-2 failures: 2 rngtest: FIPS 140-2(2001-10-10) Monobit: 0 rngtest: FIPS 140-2(2001-10-10) Poker: 0 rngtest: FIPS 140-2(2001-10-10) Runs: 0 rngtest: FIPS 140-2(2001-10-10) Long run: 2 rngtest: FIPS 140-2(2001-10-10) Continuous run: 0 rngtest: input channel speed: (min=111.974; avg=1517.102; max=1926.539)Kibits/s rngtest: FIPS tests speed: (min=7.138; avg=32.986; max=36.261)Mibits/s rngtest: Program run time: 13464193 microseconds |
Zařízení /dev/urandom
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[root@linux ~]# cat /dev/urandom | rngtest -c 1000 rngtest 5 Copyright (c) 2004 by Henrique de Moraes Holschuh This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. rngtest: starting FIPS tests... rngtest: bits received from input: 20000032 rngtest: FIPS 140-2 successes: 997 rngtest: FIPS 140-2 failures: 3 rngtest: FIPS 140-2(2001-10-10) Monobit: 0 rngtest: FIPS 140-2(2001-10-10) Poker: 0 rngtest: FIPS 140-2(2001-10-10) Runs: 0 rngtest: FIPS 140-2(2001-10-10) Long run: 3 rngtest: FIPS 140-2(2001-10-10) Continuous run: 0 rngtest: input channel speed: (min=344.212; avg=20959.313; max=2790178.571)Kibits/s rngtest: FIPS tests speed: (min=1.270; avg=21.801; max=36.964)Mibits/s rngtest: Program run time: 1903333 microseconds |
V případě, že máme entropie nedostatek, může nám pomoci projekt Haveged. Tento nástroj bývá součástí moderních distribucí.
Množství entropie a její využití se během práce výpočetního systému mění. Tento trend zachycuje následující graf. Takřka dvojnásobný nárůst je způsoben nasazením haveged
.
Dostatečně kvalitní entropie:
Obrázek zachycující vygenerovanou entropii lze získat následujícím příkazem:
1 |
[root@linux ~]# cat /dev/hwrng | rawtoppm -rgb 256 256 | pnmtopng > random_hwrng.png |
Každým spuštěním se vygeneruje obrázek obsahující zcela jiná data. Pokud bychom viděli nějaké jednolité shluky, nejsou náhodná data příliš kvalitní. Takovým příkladem může být využití generátoru RANDU:
Jak je na obrázku vidět, výstup je velmi předvídatelný.
Moderní nároky na šifrování dat a nové algoritmy nás přivádí k jednoznačné otázce: „Má náš systém opravdu dostatek kvalitní entropie?“
Pingback: Šifrování a podepisování datové komunikace s pomocí GnuPG | brichacek.net