Odakle dolazi nasumičnost
crypto.getRandomValues pita CSPRNG operativnog sistema (getrandom() na Linuxu, SecRandomCopyBytes na macOS-u, BCryptGenRandom na Windowsu), koji se inicijalizuje iz hardverskih događaja i, na modernim procesorima, RDRAND instrukcije. Nepredvidiv je u oba smera: poznavanje milion izlaza ne govori vam ništa o sledećem. Math.random() nije; to je brz PRNG sa malim unutrašnjim stanjem, dobar za igre i nikada za tajne.
Koliko bajtova
| Namena | Bajtova | Zašto |
|---|---|---|
| ID sesije, CSRF token | 16–32 | 128 bitova je izvan dometa grube sile; 32 bajta je uobičajena podrazumevana vrednost. |
| API ključ / tajna | 32 | 256 bitova; hešira se sa SHA-256 za čuvanje, kao lozinka, ali bez potrebe za sporim heširanjem jer je nasumičan. |
| HMAC / JWT ključ za potpisivanje | 32–64 | Uskladite sa izlazom heša: 32 za SHA-256, 64 za SHA-512. |
| AES ključ | 16 / 32 | AES-128 ili AES-256. |
| So | 16 | Jedinstvenost je ono što je bitno; 128 bitova je garantuje. |
| Token za reset lozinke u URL-u | 16–24 | Base64URL ga drži kratkim; čuvajte njegov heš, neka brzo ističe. |
Nasumični celi brojevi bez pristrasnosti
Uzimanje random_byte % 6 za kockicu je suptilno pogrešno: 256 nije deljivo sa 6, pa 1–4 ispadaju malo češće nego 5–6. Ispravan metod izvlači vrednost, odbacuje je ako upadne u preostali opseg na vrhu, i pokušava ponovo; to radi ovaj generator, kao i secrets.randbelow, crypto.randomInt i rand.Intn.
Ključevi sa prefiksom
Prefiksi poput sk_live_, ghp_ ili AKIA ne dodaju bezbednost, ali ključeve čine prepoznatljivim u logovima i omogućavaju skenerima tajni (GitHubovom, gitleaks) da pronađu procurele. Izaberite prefiks jedinstven za vaš servis i nasumični deo držite na 32 bajta.
Pitanja
Da li je ovo dobro kao openssl rand ili /dev/urandom?
Da: pregledač poziva isti generator operativnog sistema koji ti alati čitaju. Izlaz je pogodan za ključeve i tajne. Ako vam ipak treba u shellu: openssl rand -hex 32, ili head -c 32 /dev/urandom | base64.
Da li API ključeve treba čuvati heširane?
Da, brzim hešom kao što je SHA-256; pošto je ključ nasumičan, spor heš za lozinke nije potreban. Prikažite ključ jednom pri kreiranju i čuvajte samo heš, kao što rade GitHub i Stripe.
Šta je Base64URL?
Base64 sa - i _ umesto + i /, obično bez paddinga, tako da vrednost može da stoji u URL-u ili kolačiću bez escape-ovanja. JWT-ovi i većina modernih tokena ga koriste.
Zašto ne koristiti jednostavno UUID kao token?
UUIDv4 ima 122 nasumična bita, što je dovoljno, ali njegov fiksni format odaje šta je i troši znakove na crtice. Za tajne su sirovi nasumični bajtovi u Base64URL kraći i jači. UUID-ovi su za identifikatore, ne za tajne.