crypto
node:crypto proporciona hashing, HMAC, bytes aleatorios y cifrados para tokens, verificación de webhooks y cifrado. Usa las APIs integradas antes de añadir wrappers de criptografía de npm.
Busca en todas las páginas de la documentación
node:crypto proporciona hashing, HMAC, bytes aleatorios y cifrados para tokens, verificación de webhooks y cifrado. Usa las APIs integradas antes de añadir wrappers de criptografía de npm.
import { createHmac, randomBytes, timingSafeEqual, randomUUID } from 'node:crypto';
const token = randomBytes(32).toString('base64url');
const id = randomUUID();
const sig = createHmac('sha256', secret).update(body).digest('hex');Cuándo usarlo:
scrypt/argon2 a través de crypto o una librería dedicada)import { createHmac, randomBytes, scrypt, timingSafeEqual } from 'node:crypto';
import { promisify } from 'node:util';
const scryptAsync = promisify(scrypt);
export function signPayload(body: Buffer, secret: string): string {
return createHmac('sha256', secret).update(body).digest('hex');
}
export function verifySignature(body: Buffer, secret: string, providedHex: string): boolean {
const expected = Buffer.from(signPayload(body, secret), 'hex');
const provided = Buffer.from(providedHex, 'hex');
if (expected.length !== provided.length) return false;
return timingSafeEqual(expected, provided);
}
export async function hashPassword(password: string, salt?: Buffer): Promise<{ salt: Buffer; hash: Buffer }> {
const s = salt ?? randomBytes(16);
const hash = (await scryptAsync(password, s, 64)) as Buffer;
return { salt: s, hash };
}import { webcrypto } from 'node:crypto';
const key = await webcrypto.subtle.generateKey(
{ name: 'AES-GCM', length: 256 },
true,
['encrypt', 'decrypt'],
);Lo que esto demuestra:
timingSafeEqual en los digestsscrypt a través de promisify para el almacenamiento de contraseñas con sal por usuariosubtle para AES-GCM al interoperar con la criptografía del navegadorrandomBytes, randomUUID para tokens.| Tarea | API |
|---|---|
| Token de sesión | randomBytes |
| Verificación de webhook | HMAC + timingSafeEqual |
| Almacenamiento de contraseñas | scrypt/argon2 |
| Cifrado AES | createCipheriv o subtle |
import { createHash } from 'node:crypto';
export function sha256Hex(input: string): string {
return createHash('sha256').update(input, 'utf8').digest('hex');
}=== - fuga. Solución: compara los digests HMAC con timingSafeEqual.randomBytes.| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| bcrypt npm | Estándar del equipo bcrypt | scrypt es suficientemente nativo |
| Cifrado de sobre KMS | Claves maestras en la nube | Tokens de desarrollo local |
| Librería JWT | Claims firmados con exp | HMAC sin procesar es suficiente para webhooks |
| Solo TLS | Datos en tránsito | Necesidad de cifrado de campo en reposo |
UUID v4 para identificadores; randomBytes para secretos de longitud personalizada.
Codificación segura para URL sin +/ - toString('base64url') en Buffer.
Ambos en crypto - scrypt es resistente a la memoria; elige según la revisión de seguridad y el ajuste de parámetros.
El servidor HTTPS de Node usa el módulo tls - certificados de la plataforma o cert-manager.
Transmite con createCipheriv para payloads grandes - subtle para fragmentos/claves más pequeños.
Soporta dos secretos durante la ventana de rotación - verifica contra ambos.
Generalmente está bien - evita compartir claves entre hilos sin una propiedad clara.
Compilaciones especiales de Node - consulta la seguridad de la organización - no la imagen genérica predeterminada.
Pseudonimiza con hash salado para registros - no es una identificación reversible.
Seguridad de los búferes - patrones de borrado y comparación.
Consulta Verificación de Webhook - patrón HMAC.
Usa createCipheriv con IV explícito - las APIs heredadas son inseguras.
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 19 jul 2026