Bezpečnostní průvodce
Generování hesel na straně klienta pomocí Web Crypto a rejection samplingu
Technický whitepaper vysvětlující model generování hesel v prohlížeči PwdGen, hranice entropie, rejection sampling a omezení soukromí.
Abstrakt
PwdGen používá metodu generování na straně klienta: prohlížeč nebo runtime Web Crypto poskytuje náhodné bajty, rejection sampling mapuje tyto bajty na nezkreslené omezené indexy a Fisher-Yates shuffle rozděluje požadované třídy znaků do výsledného hesla. Metoda je záměrně malá, auditovatelná a reprodukovatelná napříč webovou aplikací, API adaptérem, CLI a připraveným balíčkem pwdgen-core.
Tento dokument popisuje inženýrský model. Není to tvrzení o novém kryptografickém primitivu, formální standard ani nezávislý audit třetí strany.
Zdroj náhodnosti
Generátor požaduje kryptograficky silné náhodné hodnoty prostřednictvím crypto.getRandomValues(). Očekává se, že implementace Web Crypto používají kryptograficky bezpečný generátor pseudonáhodných čísel (CSPRNG) naplněný vysoce kvalitní entropií poskytovanou hostitelským prostředím. V praxi prohlížeče delegují tuto odpovědnost na operační systém a platformové kryptografické poskytovatele.
PwdGen netvrdí, že každé volání generování hesla přímo vzorkuje zdroj hardwarového šumu. Bezpečnější a přesnější tvrzení je, že prohlížeč poskytuje výstup CSPRNG prostřednictvím Web Crypto API a že PwdGen se vyhýbá nekryptografickým pseudonáhodným rozhraním.
Proč ne Math.random()
Math.random() není specifikováno pro bezpečnostně citlivé použití. Je vhodné pro simulace, vizuální efekty a běžné náhodné chování UI, ale neposkytuje záruky očekávané pro hesla, resetovací kódy, podpisové klíče nebo jiné přihlašovací údaje.
PwdGen považuje nezabezpečené pseudonáhodné záložní řešení za chybový stav. Pokud Web Crypto není k dispozici, generátor by měl zobrazit chybu kompatibility, místo aby tiše produkoval slabé přihlašovací údaje.
Rejection sampling
Náhodné bajty a celá čísla jsou obvykle získávána z rozsahu mocniny dvou. Abecedy hesel mají zřídka velikost, která tento rozsah dělí přesně. Přímá operace modulo může způsobit, že některé znaky jsou o něco pravděpodobnější než jiné.
PwdGen používá rejection sampling:
- Získejte 32bitové celé číslo bez znaménka.
- Vypočítejte největší násobek velikosti abecedy, který se vejde do 32bitového rozsahu.
- Zamítněte hodnoty nad touto hranicí.
- Aplikujte modulo pouze na zbývající úplný rozsah.
Tím je zajištěno rovnoměrné vybírání znaků bez měřitelného zkreslení modulo.
Pokrytí znaků a entropie
Pro nakonfigurované zásady hesel generátor nejprve vybere jeden znak z každé povolené třídy, zbytek doplní z kombinované abecedy a poté výsledek promíchá. To pomáhá splnit pravidla cílového hesla, aniž by byla předvídatelná třída na předvídatelném místě.
Teoretický odhad entropie je:
bits = length × log2(uniqueAlphabetSize)
Tato hodnota je horní hranicí pro rovnoměrně náhodné volby z nakonfigurované abecedy. Nezohledňuje opakované použití hesel, uživatelem upravený výstup, kompromitovaná zařízení, uniklá hesla nebo slabé ukládání cílovou službou.
Hranice soukromí
V nástrojích prohlížeče zůstávají vygenerované hodnoty v paměti stránky a viditelných polích výsledků, dokud je uživatel nezkopíruje nebo neexportuje. Místní generátory neodesílají vygenerovaná hesla na servery PwdGen, nevkládají je do URL ani nezapisují do událostí analýzy.
Tato hranice nechrání před škodlivými rozšířeními prohlížeče, správci schránky, kompromitací operačního systému, snímáním obrazovky, phishingovými stránkami nebo tím, že uživatel vloží vygenerované heslo do nebezpečného cíle.
Reprodukovatelná implementace
Veřejný balíček pwdgen-cli a připravený balíček pwdgen-core existují, aby byl model generování kontrolovatelný i mimo webovou stránku. Unit testy pokrývají zahrnutí tříd znaků, vyloučené znaky, neplatné konfigurace, vzorce entropie a absenci nezabezpečených pseudonáhodných záložních cest.
Cílem není udělat z PwdGen soukromý standard. Cílem je, aby implementace byla dostatečně malá na to, aby ji vývojáři mohli číst, testovat a nahradit, když jejich prostředí vyžaduje jinou hranici důvěry.