Első sorban kódelemzések alkalmával előforduló tipikus probléma, hogy különböző kriptográfiai funkciók - legyen szó akár egyszer használatos jelszavakról, munkamenet-azonosítókról vagy ne adj' isten kulcsgenerálásról - ellátására a programozók nem kriptográfiailag biztonságos álvéletlen-generátort használnak.
Állítólag Neumann apánk mondta, hogy aki algoritmikus módszerekkel kíván valódi véletlenszámot előállítani, az a bűn állapotában leledzik, ennek ellenére szép módszerek léteznek nagyon is véletlennek látszó, különböző megkívánt eloszlásokat produkáló álvéletlenek generálására (bár ha jól emlékszem az egyenletesből bármilyen más is előállítható, de javítsatok ki ha tévedek).
Ezekkel az egyszerű PRNG-nek (Pseudo-Random Number Generator) nevezett állatokkal azonban biztonsági szempontból sok probléma felmerülhet, tipikusan pl. nem szeretjük, ha a generátor néhány ismert értéke alapján megjósolhatók a jövőbeni értékek - ez nyilván elég komoly problémákat okoz minden fent felsorolt példa alkalmazásnál.
Ennek kiküszöbölésére a kriptográfiailag biztonságos álvéletlen-generátorok (Cryptographically Secure PRNG) igyekeznek a futtatókörnyezetük nehezen megjósolható paramétereit (pl. hálózati stack vagy process fa állapota) belekeverni a kimenetbe illetve belső állapotukba, ilyen módon a támadónak túl sok bizonytalansági tényezővel kell számolnia a generátor belső állapotára történő következtetéshez.
És bár a nem megfelelő PRNG használatából következő kockázatok magátólértetődőnek tűnhetnek, a gyakorlatban általában igen nehéz a problémát egy laikus (döntéshozó) számára demonstrálni, az utóbbi hónapokban azonban született néhány remek kutatás a helyzet javítására:
Először is a Cylance BlackHate-es előadása jó alapozót ad a PRNG-k iránt érdeklődőknek, az emellé kiadott Prangster nevű eszköz pedig hasznos segítséget nyújthat az eddig elméleti síkon létező támadási vektorok gyakrolatba történő átültetésére, legyen szó javás, natív windowsos, BSD-s környezetről vagy a V8 motoron futó alkalmazásokról.
Másodszor ma az Openwall csapata megmutatta, hogy a PHP Mersenne-twisteren alapuló (nem CSPRNG) mt_rand() függvényének kiinduló (seed) értéke pofátlanul kevés kimeneti érték alapján könnyedén megjósolható, így a szép számban (és helyeken ;) futó PHP-s alkalmazások sem érezhetik magukat túlzott biztonságban.
Nézzétek át a kódjaitokat és használjatok rendes CSPRNG-t, ahol szükséges - segítséget általában kedvenc programnyelvetek dokumentációja nyújt, de kommentben is ér okosakat kérdezni!
Az inspirációért köszönet @tomzorz_-nak!
Bónuszként - a kriptóhoz kapcsolódóan - tudom ajánlani a mai XKCD-t:
Részletek itt.