crypto.randomBytes / randomUUID / randomInt în Node.js

Criptografie și utilitare Node.js 0.5.8 (randomBytes); randomInt din 14.10; randomUUID din 14.17 / 15.6

Valori aleatorii sigure pentru criptografie: octeți pentru chei și token-uri, UUID-uri, numere întregi într-un interval.

Sintaxă
import { randomBytes, randomUUID, randomInt } from "node:crypto";
randomBytes(n)
randomUUID()
randomInt([min,] max)

Ce face crypto.randomBytes / randomUUID / randomInt

Math.random() nu este potrivit pentru lucruri care trebuie să fie greu de ghicit (token-uri de resetare a parolei, coduri de confirmare, chei). Funcțiile din node:crypto folosesc generatorul sigur al sistemului de operare.

randomBytes(n) întoarce n octeți aleatorii într-un Buffer; transformați în hex sau base64url devin token-uri potrivite pentru adrese web. randomInt(min, max) dă un întreg între min (inclus) și max (exclus), fără dezechilibrul care apare la Math.floor(Math.random() * n).

randomUUID() generează un identificator unic de forma xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (UUID versiunea 4). Aceeași funcție există și global, ca crypto.randomUUID(), în browser și în Node.js (vezi pagina din secțiunea JavaScript).

Parametri

Parametru Descriere
n Numărul de octeți (randomBytes).
min, max Intervalul pentru randomInt: min inclus (implicit 0), max exclus.

Ce returnează

randomBytes: un Buffer. randomUUID: un șir de 36 de caractere. randomInt: un număr întreg.

Exemple

Exemplul 1: Token-uri, UUID și cod de confirmare

import { randomBytes, randomUUID, randomInt } from "node:crypto";

console.log(randomBytes(16).toString("hex"));
console.log(randomBytes(24).toString("base64url"));
console.log(randomUUID());
console.log(String(randomInt(0, 1_000_000)).padStart(6, "0"));

Rezultat posibil (diferă la fiecare rulare)

9f2c4e0b7a1d38e65c0f4b2a9d7e1c3f
q3V_8pZr1xK0tWm2c9YbN5aLhD4eR7uF
2b8d1e64-7f3a-4c1d-9e0b-5a6f7c8d9e10
048213

Exemplul 2: Ce formă au valorile

Valorile se schimbă la fiecare rulare, dar forma lor nu: verificăm lungimile și tiparul UUID.

import { randomBytes, randomUUID, randomInt } from "node:crypto";

const token = randomBytes(32).toString("hex");
console.log("token hex:", token.length, "caractere");

const uuid = randomUUID();
console.log("UUID v4 valid:", /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(uuid));

const zaruri = Array.from({ length: 1000 }, () => randomInt(1, 7));
console.log("între 1 și 6:", Math.min(...zaruri), Math.max(...zaruri));

Rezultat

token hex: 64 caractere
UUID v4 valid: true
între 1 și 6: 1 6

Exemplul 3: Alegerea aleatorie a unui câștigător

import { randomInt } from "node:crypto";

const participanti = ["Ana", "Ion", "Maria", "Vlad", "Elena"];
const castigator = participanti[randomInt(participanti.length)];
console.log("Câștigătorul concursului:", castigator);

Rezultat posibil (diferă la fiecare rulare)

Câștigătorul concursului: Maria

Greșeli frecvente

  • Generezi token-uri de resetare a parolei cu Math.random().toString(36): valorile pot fi ghicite. Folosește randomBytes(32).
  • Scrii randomInt(1, 6) pentru un zar: max este exclus, deci 6 nu apare niciodată. Scrie randomInt(1, 7).
  • Pui un token base64 într-o adresă web: caracterele +, / și = trebuie codificate. Folosește "base64url".

Comenzi înrudite

  • crypto.createHash / createHmac: Calculează amprenta (hash) unui text sau fișier cu SHA-256 și semnături HMAC pentru verificarea mesajelor.
  • crypto.scrypt (parole): Transformă o parolă într-o cheie greu de spart, cu sare aleatorie: modul corect de a salva parolele cu modulele Node.js.
  • Buffer: Șir de octeți din Node.js: date binare din fișiere, rețea sau criptografie, cu conversii în text, hex și base64.