Français
  • crypto
  • edge

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.

Sijie
Sijie
Developer

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.