Migration de Node.js crypto vers Web Crypto API : une expérience guidée
Approfondissez l'expérience de transition de crypto vers Web Crypto API, en fournissant un guide complet axé sur 3 scénarios courants.
Introduction
L'API Web Crypto est un nouvel outil Javascript pour la cryptographie. Il est compatible avec les navigateurs modernes et les principales plateformes, y compris Cloudflare Workers et Vercel, ainsi qu'avec Node.js. Une telle interopérabilité implique un rêve de développeur - écrire votre code de cryptographie une fois et le faire fonctionner sur de nombreuses plateformes à l'aide de l'API Web Crypto.
Cependant, Node.js dispose déjà d'un module "crypto" avec une longue histoire, laissant une quantité importante de code hérité nécessitant une migration. Dans cet article, nous nous plongerons dans l'expérience de transition, en fournissant un guide complet axé sur 3 scénarios courants. Notre objectif est d'éclairer le chemin vers une migration réussie.
Qu'est-ce que Web Crypto API
Web Crypto API, une norme ouverte du W3C pour Javascript, est une collection de primitives de cryptographie standardisées définies dans la spécification de l'API Web Cryptography. Elle a été créée après que plusieurs navigateurs et plateformes ont commencé à ajouter leurs propres fonctions de cryptographie non interopérables.
L'API fournit des primitives pour la génération de clés, le cryptage et le décryptage, les signatures numériques, la dérivation de clés et de bits, et le digest cryptographique. Elle est centrée autour d'une interface appelée SubtleCrypto, vous pouvez trouver plus de détails et de tutoriels dans la documentation Mozilla MDN.
Mais Node.js a déjà un module crypto ?
Les développeurs de Node.js sont généralement familiers avec le module crypto. Il offre un ensemble complet de primitives cryptographiques. Ce module ne fournit pas seulement des mécanismes pour les mêmes opérations cryptographiques définies dans l'API Web Crypto, mais il inclut souvent une gamme plus large d'algorithmes cryptographiques.
Alors pourquoi avons-nous encore besoin de Web Crypto API ? Comme Javascript devient populaire sur de nombreuses plateformes et environnements, du côté client aux serveurs et surtout sur le bord, il est important d'avoir un outil cryptographique multiplateforme pour simplifier les processus.
En outre, les fonctions de la norme Web Crypto API renvoient toutes des promesses et supportent la syntaxe async/await. C'est un avantage significatif sur le module crypto, qui est synchronisé et peut bloquer la boucle d'événements.
Et il y a une chose intéressante que Node.js ajoute son support pour Web Crypto API, cela signifie, dans la plupart des cas, Web Crypto API est parfait dans la plupart des plateformes connues.
Utilisation de Web Crypto API
Sur la plupart des plateformes, la collection de Web Crypto APIs est accessible via l'objet global crypto
, qui inclut 3 utilitaires de niveau supérieur : getRandomValues
, randomUUID
et subtle
.
Il y a de nombreuses différences par rapport au module crypto traditionnel. Elles peuvent être résumées en 3 parties les plus courantes. Passons-les en revue et voyons comment migrer à partir du code existant.
#1 Générer des valeurs aléatoires
Dans le module crypto, vous pouvez générer des valeurs aléatoires en appelant randomBytes
Il y a une fonction similaire appelée getRandomValues
dans Web Crypto, mais la valeur de retour est un ArrayBuffer
, nous avons donc besoin d'une autre étape pour la convertir en chaîne.
#2 Hashing (ou digest)
createHash
est facile à utiliser dans le module crypto :
Dans Web Crypto, nous pouvons utiliser subtle.createHash
Comme vous pouvez le voir, la transformation de ArrayBuffer
en chaîne hexadécimale est également nécessaire.
#3 Cryptage et décryptage
Dans le module crypto, le cryptage et le décryptage AES peuvent être implémentés avec :
Dans Web Crypto, nous devons d'abord créer une clé en utilisant importKey
:
Conclusion
Comme vous pouvez le voir, la migration n'est pas difficile, le travail principal est de changer la syntaxe pour s'adapter à la nouvelle API et de résoudre ArrayBuffer
avec TextEncoder
.
En tant que produit d'identité, Logto utilise la cryptographie à de nombreux endroits. Nous avons migré du module crypto vers l'API Web Crypto. Cette transition nous permet de mieux nous adapter aux environnements de bord et rend possible l'exécution du code SDK en toute sécurité dans le navigateur.