Hashe et passord trygt
Argon2id fra standardbiblioteket — riktig verktøy for passord, uten en eneste ekstern avhengighet.
Passord skal aldri lagres i klartekst — og heller ikke med en rask hash som SHA-256. Standardbiblioteket har Argon2id, som er laget nettopp for dette.
bruk std.argon2id som argon2
funksjon start() -> heltall {
la passord = "et-langt-og-tilfeldig-passord"
la salt = builtin.random_hex(16)
la hash = argon2.hash(passord, salt)
skriv("Lagre denne, ikke passordet: " + hash)
hvis argon2.verify(passord, hash) {
skriv("Passordet stemmer")
} ellers {
skriv("Feil passord")
}
returner 0
}Hva som skjer her
Du lagrer aldri passordet. Du lagrer resultatet av argon2.hash, og når brukeren logger inn senere, kjører du argon2.verify med det de skrev inn mot den lagrede verdien. Selv med full tilgang til databasen din får en angriper ikke passordene ut igjen — bare muligheten til å gjette, én gjetning om gangen.
Saltet er tilfeldige byte som blir unike per passord. Uten salt ville to brukere med samme passord få samme hash, og en angriper kunne slå opp vanlige passord i en ferdiglaget tabell. Med salt må hvert passord angripes for seg. Funksjonen builtin.random_hex henter fra en kryptografisk tilfeldighetskilde — ikke bruk en vanlig tilfeldig-generator til dette.
Hvorfor Argon2id og ikke SHA-256
Det virker bakvendt, men her er fart en ulempe. SHA-256 er laget for å være rask, fordi den skal hashe store filer. Nettopp derfor er den elendig til passord: en angriper med et grafikkort kan prøve milliarder av gjetninger i sekundet.
Argon2id er laget for å være treg og minnekrevende med vilje. Den kan stilles inn på hvor mye tid og minne hver utregning skal koste. Det merkes knapt for deg — brukeren venter noen hundre millisekunder ved innlogging — men det gjør masseangrep tusenvis av ganger dyrere. Argon2id er dessuten varianten som står imot både minnehandels- og sidekanalangrep, og er den du bør velge når du er i tvil.
Riktig verktøy til riktig oppgave
Standardbiblioteket har også BLAKE2b for vanlige hasher, og ChaCha20-Poly1305 for autentisert kryptering. Det er tre ulike jobber:
- Passordhash (Argon2id): én vei, med vilje treg, for verdier du aldri skal ha tilbake.
- Vanlig hash (BLAKE2b): én vei, rask, for sjekksummer og fingeravtrykk.
- Kryptering (ChaCha20-Poly1305): to veier, for data du skal lese igjen senere.
Bruk aldri en passordhash til kryptering, eller omvendt. Det er en av de vanligste og mest alvorlige feilene i hjemmelaget sikkerhetskode.
Les også
- En webtjeneste med flere ruterEt komplett program som svarer på flere adresser, leser spørrestrengen og returnerer både HTML og ren tekst.
- Lagre og hente dataOpprett en tabell, skriv rader og les dem ut igjen — med de innebygde databasefunksjonene, og uten ett spørsmål per rad.
- Lese og skrive filerFilhåndtering med kapabiliteter — og hvorfor programmet ditt ikke får lese det du ikke har gitt det.