Español
  • crypto
  • borde

Migrando de Node.js crypto a Web Crypto API: Una experiencia guiada

Profundice en la experiencia de transición de cripto a Web Crypto API, proporcionando una guía completa centrada en 3 escenarios comunes.

Sijie
Sijie
Developer

Introducción

La Web Crypto API es una nueva herramienta de Javascript para la criptografía. Es compatible con los navegadores modernos y las plataformas líderes, incluyendo Cloudflare Workers y Vercel, y también Node.js. Tal interoperabilidad implica el sueño de un desarrollador: escribir su código de criptografía una vez y ejecutarlo en muchas plataformas utilizando la Web Crypto API.

Sin embargo, Node.js ya tiene un módulo "crypto" con una larga historia, dejando una cantidad significativa de código heredado que necesita migración. En este artículo, profundizaremos en la experiencia de transición, proporcionando una guía completa centrada en 3 escenarios comunes. Intentamos iluminar el camino hacia una migración exitosa.

¿Qué es Web Crypto API?

Web Crypto API, un estándar abierto de W3C para JavaScript, es una colección de primitivas de criptografía estandarizadas definidas en la especificación de la API de criptografía web. Fue creada después de que varios navegadores y plataformas comenzaron a agregar sus propias funciones de criptografía no inter-operables.

La API proporciona primitivas para la generación de claves, cifrado y descifrado, firmas digitales, derivación de claves y bits, y resumen criptográfico. Está centrado en una interfaz llamada SubtleCrypto, puedes encontrar más detalles y tutoriales en la documentación de Mozilla MDN.

¿Pero Node.js ya tiene un módulo de criptografía?

Los desarrolladores de Node.js suelen estar familiarizados con el módulo de criptografía. Ofrece un conjunto completo de primitivas criptográficas. Este módulo no solo proporciona mecanismos para las mismas operaciones criptográficas definidas en la Web Crypto API, sino que a menudo incluye una gama más amplia de algoritmos criptográficos.

Entonces, ¿por qué todavía necesitamos Web Crypto API? A medida que Javascript se populariza en muchas plataformas y entornos, desde el lado del cliente hasta los servidores y especialmente en el borde, es importante tener una herramienta criptográfica multiplataforma para simplificar los procesos.

Además, las funciones en el estándar Web Crypto API todos devuelven promesas y soportan la sintaxis async/await. Esto es una ventaja significativa sobre el módulo de criptografía, que es sincrónico y puede bloquear el bucle de eventos.

Y hay una cosa interesante que Node.js agrega su apoyo para Web Crypto API, eso significa, en la mayoría de los casos, Web Crypto API es perfecto en la mayoría de las plataformas conocidas.

Usando Web Crypto API

En la mayoría de las plataformas, la colección de Web Crypto APIs es accesible a través del objeto global crypto, que incluye 3 utilidades de nivel superior: getRandomValues, randomUUID y subtle.

Hay muchas diferencias en comparación con el módulo de criptografía tradicional. Se pueden resumir en 3 partes más comunes. Vamos a través de ellos y ver cómo migrar desde el código existente.

#1 Generar valores aleatorios

En el módulo de criptografía, puedes generar valores aleatorios llamando a randomBytes

Hay una función similar llamada getRandomValues en Web Crypto, pero el valor devuelto es un ArrayBuffer, por lo que necesitamos otro paso para convertirlo en cadena.

#2 Hashing (o digest)

createHash es fácil de usar en el módulo de criptografía:

En Web Crypto, podemos usar subtle.createHash

Como puedes ver, también se necesita la transformación de ArrayBuffer a una cadena hex.

#3 Encriptación y descriptación

En el módulo de criptografía, la encriptación y descriptación de AES se pueden implementar con:

En Web Crypto, necesitamos crear la clave por importKey primero:

Conclusión

Como puedes ver, la migración no es difícil, el trabajo principal es cambiar la sintaxis para adaptarse a la nueva API y resolver ArrayBuffer con TextEncoder.

Como un producto de identidad, Logto utiliza la criptografía en muchos lugares. Hemos migrado del módulo de criptografía a la Web Crypto API. Esta transición nos permite adaptarnos mejor a los entornos de borde y hace posible la ejecución de código de SDK de forma segura en el navegador.