Bezpečnostní průvodce
Proč Math.random není bezpečný pro hesla
Zjistěte, proč je Math.random vhodný pro UI efekty, ale ne pro hesla, resetovací kódy, tokeny nebo jiná bezpečnostně citlivá tajemství.
Shrnutí
Math.random() je obecná JavaScriptová pseudo-náhodná funkce. Je užitečná pro animace, náhodné chování UI, ukázky, hry a simulace. Není specifikována pro kryptografickou bezpečnost a neměla by se používat k generování hesel, resetovacích kódů, API tajemství, podpisových klíčů nebo obnovovacích tokenů.
Problém
Generátor hesel potřebuje nepředvídatelnost vůči útočníkovi, nejen hodnoty, které se uživateli zdají různorodé. Math.random() neposkytuje záruku kryptografické bezpečnosti podle standardů prohlížeče a implementace se mohou mezi enginy lišit.
Bezpečnější možnost v prohlížeči
Moderní prohlížeče poskytují crypto.getRandomValues() prostřednictvím Web Crypto API. PwdGen používá toto rozhraní a metodu rejection sampling, která zabraňuje zkreslenému výběru znaků. Pokud toto API není k dispozici, bezpečným chováním je zastavit generování a vysvětlit požadavek na kompatibilitu.
Jak zkontrolovat generátor
Prohledejte zdrojový kód na výskyt Math.random. Seriózní generátor hesel by jej neměl používat pro znaky hesel. Může se objevit v dokumentaci vysvětlující, proč je nebezpečný, ale ne v cestě generování.
Podrobný návod
Tento průvodce se zaměřuje na to, proč je Math.random nevhodný pro hesla a tajemství. Je psán pro vývojáře, studenty a uživatele nástrojů, kteří kontrolují, zda generátor používá bezpečnou náhodnost. Praktickým cílem není vytvořit dramatické bezpečnostní tvrzení, ale zvolit návyk pro hesla, který přežije každodenní použití: přihlašovací formuláře, správce hesel, mobilní klávesnice, obnovu účtu, sdílená zařízení a občasné služby s podivnými validačními pravidly. Bezpečné doporučení je užitečné pouze tehdy, pokud ho skutečný člověk může konzistentně dodržovat.
Nejbezpečnějším výchozím bodem je náhodnost plus jedinečnost. Náhodnost znamená, že hodnota je vybrána z velkého prostoru kryptograficky vhodným náhodným zdrojem, nikoli vymyšlena z narozenin, jména domácího mazlíčka, vzoru na klávesnici nebo oblíbeného citátu. Jedinečnost znamená, že stejné heslo není použito nikde jinde. Dlouhé, ale znovu použité heslo může rychle selhat po jedné nesouvisející krádeži dat, zatímco jedinečné náhodné heslo omezí škody na jediný účet, kde bylo použito.
Pro toto téma je praktickým výchozím nastavením crypto.getRandomValues s rejection sampling místo Math.random. Toto nastavení můžete použít podle průvodce Web Crypto API a poté uložit výslednou hodnotu do důvěryhodného správce hesel. PwdGen generuje hodnoty lokálně v prohlížeči pomocí Web Crypto; vygenerované heslo není odesláno na server PwdGen. Tento lokální design snižuje expozici na straně serveru, ale nechrání před všemi hrozbami. Škodlivé rozšíření prohlížeče, kompromitované zařízení, phishingová stránka nebo nebezpečná manipulace se schránkou mohou stále odhalit tajemství po jeho vygenerování.
Nejčastějšími problémy, kterým je třeba se vyhnout, jsou předvídatelné pseudo-náhodné sekvence, modulo bias, vlastní náhodné funkce a demo kód zkopírovaný do produkce. Tyto problémy jsou důležité, protože útočníci jen zřídka potřebují brute-force všechna možná hesla, když jim lidské návyky poskytnou zkratku. Credential stuffing, phishing, uniklé seznamy hesel a zneužití obnovy účtu jsou často realističtější než čistě matematické hledání. Proto nejlepší rada kombinuje kvalitu hesel s ochranou na úrovni účtu, jako je MFA, passkeys, ukládání obnovovacích kódů a pravidelná kontrola obnovovacího e-mailu nebo telefonu.
Použijte tento kontrolní seznam při aplikaci doporučení:
- Nepoužívejte Math.random pro hesla.
- Používejte Web Crypto v prohlížečích.
- Používejte Node crypto nebo prověřený balíček v CLI kódu.
- Testujte na náhodný fallback kód.
Pokud webová stránka odmítne ideální nastavení, nenuťte heslo ručně do slabšího vzoru. Upravujte jednu proměnnou najednou. Pokud jsou symboly odmítnuty, ponechte velká písmena, malá písmena a čísla a zvyšte délku. Pokud je maximální délka nízká, použijte největší akceptovanou délku a ujistěte se, že hodnota je jedinečná. Pokud musí být heslo čteno nahlas, vytištěno nebo zadáno na televizní či routerové obrazovce, zvažte vyloučení matoucích znaků a zvýšení délky, abyste kompenzovali menší abecedu.
Nakonec si pamatujte hranice rad o heslech. Silné heslo je jedna vrstva obrany, nikoli záruka. Nemůže učinit phishingovou stránku bezpečnou, opravit malware nebo kompenzovat službu, která ukládá přihlašovací údaje špatně. Užitečný návyk je nudný, ale trvanlivý: vygenerujte jedinečnou hodnotu, bezpečně ji uložte, chraňte cestu obnovy a rychle ji vyměňte, pokud máte podezření na prozrazení.
Bezpečný další krok
Po přečtení tohoto průvodce proveďte jeden malý audit účtu místo snahy opravit vše najednou. Vyberte účet, který by způsobil nejvíce problémů, kdyby byl převzat, potvrďte, že jeho heslo je jedinečné, a zkontrolujte obnovovací e-mail, obnovovací telefon, metodu MFA a uložení záložních kódů. Pokud je některá část tohoto řetězce slabá, zlepšete ji, než přejdete k účtům s nižším rizikem. Toto pořadí udržuje práci zvládnutelnou a chrání účty, které útočníci s největší pravděpodobností použijí jako odrazový můstek. Proč math.random není bezpečný pro hesla, nejlepším výsledkem je opakovatelný návyk: generovat lokálně, ukládat opatrně a vyhnout se opakovanému použití.
Často kladené otázky
Je Math.random někdy v pořádku?
Ano, pro vizuální efekty, simulace a běžnou náhodnost v UI, ale ne pro přihlašovací údaje nebo bezpečnostní tokeny.
Co by měly generátory hesel používat místo toho?
Měly by používat kryptografický náhodný zdroj, jako je crypto.getRandomValues() v prohlížeči.
Používá PwdGen fallback na Math.random?
Ne. Pokud Web Crypto není k dispozici, PwdGen zobrazí varování o kompatibilitě a negeneruje hesla pomocí Math.random().