it-swarm-eu.dev

Je Rand z / dev / urandom bezpečný pro přihlašovací klíč?

Řekněme, že chci vytvořit cookie pro uživatele. Jednoduše vygenerujeme 1024 bit řetězec pomocí / dev/urandom a zkontrolujeme, zda již existuje (opakování, dokud nedostanu) jedinečný) stačí?

Měl bych generovat klíč na základě něčeho jiného? Je to náchylné nějak nějak využít?

187
Incognito

Krátká odpověď zní ano. Dlouhá odpověď je také ano. /dev/urandom poskytuje data, která jsou na základě existující technologie nerozeznatelná od skutečné náhodnosti. Získání „lepší“ náhodnosti než co /dev/urandom poskytuje bezvýznamný význam, pokud nepoužíváte jeden z mála „informačních teoretických“ kryptografických algoritmů, což není váš případ (měli byste to vědět).

Manová stránka pro urandom je poněkud zavádějící, pravděpodobně přímo špatně, když to naznačuje, že /dev/urandom může „docházet entropie“ a /dev/random by mělo být upřednostněno; jediný okamžik, kdy /dev/urandom možná znamenají problém se zabezpečením kvůli nízké entropii během prvních okamžiků čerstvé automatické instalace operačního systému; pokud se stroj zavedl do bodu, kdy začal s nějakou síťovou aktivitou, nashromáždil dostatek fyzické náhodnosti, aby poskytl náhodnost dostatečně vysoké kvality pro všechna praktická použití (zde mluvím o Linuxu; na FreeBSD, ten momentální okamžik mírného slabost vůbec nenastane). Na druhou stranu, /dev/random má tendenci blokovat v nevhodných časech, což vede k velmi reálným a nepříjemným problémům s použitelností. Nebo, řekněme to méně slovy: použijte /dev/urandom a buď šťastný; použijte /dev/random a promiň.

( Úpravy: tato webová stránka vysvětluje rozdíly mezi /dev/random a /dev/urandom zcela jasně.)

Za účelem vytvoření „cookie“: takový cookie by měl být takový, že žádný dva uživatelé nesdílejí stejný cookie a že je výpočetně nemožné, aby kdokoli „hádal“ hodnotu existujícího cookie. Posloupnost náhodných bajtů to dělá dobře, za předpokladu, že používá náhodnost odpovídající kvality (/dev/urandom je v pořádku) a že je dost dlouho. Obecně řečeno, pokud máte méně než 2n users ( n = 33 Pokud by váš systém mohl používat celá populace Země), pak sekvence n + 128 bitů je dostatečně široká ; nemusíte ani kontrolovat kolizi s existujícími hodnotami: za svého života to neuvidíte. 161 bitů se vejde do 21 bytů.

K dispozici are některé triky, které jsou proveditelné, pokud chcete kratší cookies a přesto se chcete vyhnout kolizím ve vaší databázi. Pro soubor cookie by to však nemělo být nutné (předpokládám webový kontext). Nezapomeňte také zachovávat důvěrnost svých souborů cookie (tj. Použijte protokol HTTPS a nastavte příznaky cookie „bezpečné“ a „HttpOnly“).

222
Thomas Pornin

Ano, je to skvělý způsob.

@ Thomasovo vysvětlení to přibije. A má naprostou pravdu, že kritizuje /dev/urandom mužská stránka. Na místě.

Přeskočte však „kontrolu, zda již existuje“. Tato kontrola je zbytečná. To se nestane. (Šance, že k tomu dojde, jsou nižší než pravděpodobnost, že budou zasaženy blesky - vícekrát - ve stejný den.)

25
D.W.

Pokud používáte Linux nebo NetBSD, mějte na paměti případy Edge.

V systému Linux byste se měli ujistit, že po spuštění bylo získáno dostatečné množství entropie, aby bylo možné správně nasadit CSPRNG, nebo použijte systémové volání getrandom() , abyste si přečetli z /dev/urandom a blokovat pouze ve vzácné události, kdy není k dispozici dostatečná počáteční entropie semen po spuštění.

V NetBSD byste chtěli číst z /dev/random alespoň jednou před čtením z /dev/urandom k zajištění správného nasazení.

Na FreeBSD a MacOS není žádný rozdíl mezi /dev/random a /dev/urandom.

Krátká odpověď je ještě k použití /dev/urandom.

Další podrobnosti viz Kdy použít/dev/random vs/dev/urandom .

1
Tom Hale