Sikkerhedsguide
Hvorfor Math.random ikke er sikkert til adgangskoder
Lær hvorfor Math.random er egnet til UI-effekter, men ikke til adgangskoder, nulstillingskoder, tokens eller andre sikkerhedsfølsomme hemmeligheder.
Resumé
Math.random() er en generel JavaScript pseudo-tilfældig funktion. Den er nyttig til animationer, randomiseret UI-adfærd, eksempler, spil og simuleringer. Den er ikke specificeret til kryptografisk sikkerhed og bør ikke bruges til at generere adgangskoder, nulstillingskoder, API-hemmeligheder, signeringsnøgler eller gendannelsestokens.
Problemet
En adgangskodegenerator har brug for uforudsigelighed over for en angriber, ikke blot værdier der ser varierede ud for en bruger. Math.random() giver ikke en browserstandard kryptografisk sikkerhedsgaranti, og implementeringer kan variere mellem motorer.
Den sikrere browsermulighed
Moderne browsere tilbyder crypto.getRandomValues() gennem Web Crypto API. PwdGen bruger denne grænseflade og afvisningssampling, hvilket undgår forudindtaget tegnvalg. Hvis denne API ikke er tilgængelig, er den sikre adfærd at stoppe genereringen og forklare kompatibilitetskravet.
Sådan gennemgår du en generator
Søg i kildekoden efter Math.random. En seriøs adgangskodegenerator bør ikke bruge den til adgangskodetegn. Den kan forekomme i dokumentation, der forklarer hvorfor den er usikker, men ikke i genereringsstien.
Detaljeret vejledning
Denne guide fokuserer på hvorfor Math.random er uegnet til adgangskoder og hemmeligheder. Den er skrevet til udviklere, studerende og værktøjsbrugere, der tjekker om en generator bruger sikker tilfældighed, så det praktiske mål er ikke at skabe et dramatisk sikkerhedskrav. Målet er at vælge en adgangskodevane, der kan overleve daglig brug: login-formularer, adgangskodeadministratorer, mobile tastaturer, kontogendannelse, delte enheder og lejlighedsvis en tjeneste med mærkelige valideringsregler. En sikker anbefaling er kun nyttig, hvis en rigtig person kan følge den konsekvent.
Det sikreste udgangspunkt er tilfældighed plus unikhed. Tilfældighed betyder, at værdien er valgt fra et stort rum af en kryptografisk egnet tilfældig kilde, ikke opfundet fra en fødselsdag, et kæledyrsnavn, et tastaturmønster eller et yndlingscitat. Unikhed betyder, at den samme adgangskode ikke bruges andre steder. En adgangskode, der er lang men genbrugt, kan hurtigt fejle efter én uafhængig lækage, mens en unik tilfældig adgangskode begrænser skaden til den enkelte konto, hvor den blev brugt.
For dette emne er en praktisk forudindstilling crypto.getRandomValues med afvisningssampling i stedet for Math.random. Du kan anvende denne forudindstilling med Web Crypto API-guiden og derefter gemme den endelige værdi i en betroet adgangskodeadministrator. PwdGen genererer værdier lokalt i browseren med Web Crypto; den genererede adgangskode sendes ikke til en PwdGen-server. Det lokale design reducerer eksponering på serversiden, men beskytter ikke mod alle trusler. En ondsindet browserudvidelse, en kompromitteret enhed, en phishing-side eller usikker udklipshåndtering kan stadig eksponere en hemmelighed efter den er genereret.
De mest almindelige problemer at undgå er forudsigelige pseudo-tilfældige sekvenser, modulo-bias, brugerdefinerede tilfældige funktioner og demokode kopieret til produktion. Disse problemer betyder noget, fordi angribere sjældent behøver at brute-force alle mulige adgangskoder, når menneskelige vaner giver dem en genvej. Credential stuffing, phishing, lækkede adgangskodelister og misbrug af kontogendannelse er ofte mere realistiske end en ren matematisk søgning. Derfor kombinerer det bedste råd adgangskodekvalitet med kontoniveaukontroller såsom MFA, adgangsnøgler, opbevaring af gendannelseskoder og regelmæssig gennemgang af gendannelses-e-mail eller telefonindstillinger.
Brug denne tjekliste, når du anvender anbefalingen:
- Brug ikke Math.random til adgangskoder.
- Brug Web Crypto i browsere.
- Brug Node crypto eller en gennemtestet pakke i CLI-kode.
- Test for utilsigtet fallback-kode.
Hvis et websted afviser den ideelle indstilling, tving ikke adgangskoden ind i et svagere mønster manuelt. Juster én variabel ad gangen. Hvis symboler afvises, behold store bogstaver, små bogstaver og tal aktiveret og øg længden. Hvis en maksimal længde er lav, brug den største accepterede længde og sørg for, at værdien er unik. Hvis en adgangskode skal læses højt, udskrives eller tastes på en tv- eller routerskærm, overvej at udelade forvirrende tegn og øg længden for at kompensere for det mindre alfabet.
Husk endelig grænsen for adgangskoderåd. En stærk adgangskode er ét lag af forsvar, ikke en garanti. Den kan ikke gøre en phishing-side sikker, fikse malware eller kompensere for en tjeneste, der opbevarer legitimationsoplysninger dårligt. Den nyttige vane er kedelig men holdbar: generer en unik værdi, opbevar den sikkert, beskyt gendannelsesstien, og udskift den hurtigt, hvis du har mistanke om eksponering.
Et sikkert næste skridt
Efter at have læst denne guide, lav én lille kontoaudit i stedet for at prøve at fikse alt på én gang. Vælg den konto, der ville forårsage mest besvær, hvis den blev overtaget, bekræft at dens adgangskode er unik, og tjek gendannelses-e-mailen, gendannelsestelefonen, MFA-metoden og opbevaring af backup-koder. Hvis nogen del af den kæde er svag, forbedr den del, før du går videre til konti med lavere risiko. Denne rækkefølge holder arbejdet overskueligt og beskytter de konti, som angribere sandsynligvis vil bruge som springbræt. For hvorfor math.random ikke er sikkert til adgangskoder, er det bedste resultat en gentagelig vane: generer lokalt, opbevar omhyggeligt, og undgå genbrug.
Ofte stillede spørgsmål
Er Math.random nogensinde okay?
Ja, til visuelle effekter, simuleringer og almindelig UI-tilfældighed, men ikke til legitimationsoplysninger eller sikkerhedstokens.
Hvad bør adgangskodegeneratorer bruge i stedet?
De bør bruge en kryptografisk tilfældig kilde såsom crypto.getRandomValues() i browseren.
Falder PwdGen tilbage på Math.random?
Nej. Hvis Web Crypto ikke er tilgængelig, viser PwdGen en kompatibilitetsadvarsel og genererer ikke adgangskoder med Math.random().