Migrazione da Node.js crypto a Web Crypto API: un'esperienza guidata
Approfondimento dell'esperienza di transizione da crypto a Web Crypto API, fornendo una guida completa concentrata su 3 scenari comuni.
Introduzione
La Web Crypto API è un nuovo strumento Javascript per la crittografia. È compatibile con i browser moderni e le principali piattaforme, tra cui Cloudflare Workers e Vercel, e anche Node.js. Tale interoperabilità implica un sogno per gli sviluppatori: scrivi il tuo codice crittografico una volta e eseguilo su numerose piattaforme utilizzando la Web Crypto API.
Tuttavia, Node.js ha già un modulo "crypto" con una lunga storia, lasciando un significativo quantitativo di codice legacy che necessita di migrazione. In questo articolo, ci addentreremo nell'esperienza di transizione, fornendo una guida completa incentrata su 3 scenari comuni. Miriamo a illuminare il percorso verso una migrazione di successo.
Cos'è Web Crypto API
Web Crypto API, uno standard aperto di W3C per JavaScript, è una raccolta di primitive crittografiche standardizzate definite nella specifica Web Cryptography API. È stato creato dopo che diversi browser e piattaforme hanno iniziato ad aggiungere le loro proprie funzioni crittografiche non interoperabili.
L'API fornisce primitive per la generazione di chiavi, la cifratura e la decifratura, le firme digitali, la derivazione di chiavi e bit, e il digest crittografico. È incentrata su un'interfaccia chiamata SubtleCrypto, puoi trovare più dettagli e tutorial nella documentazione di Mozilla MDN.
Ma Node.js ha già il modulo crypto?
Gli sviluppatori di Node.js sono generalmente familiari con il modulo crypto. Offre un set completo di primitive crittografiche. Questo modulo non solo fornisce meccanismi per le stesse operazioni crittografiche definite nell'API Web Crypto, ma spesso include un range più vasto di algoritmi crittografici.
Allora perché abbiamo ancora bisogno di Web Crypto API? Man mano che Javascript diventa popolare su molte piattaforme e ambienti, dal lato client ai server e soprattutto sul bordo, è importante avere uno strumento crittografico cross-platform per semplificare i processi.
Inoltre, le funzioni nello standard Web Crypto API ritornano tutte promesse e supportano la sintassi async/await. Questo è un vantaggio significativo rispetto al modulo crypto, che è sincrono e può bloccare il ciclo di eventi.
E c'è una cosa interessante che Node.js aggiunge il suo supporto per Web Crypto API, il che significa, nella maggior parte dei casi, Web Crypto API è perfetto nella maggior parte delle piattaforme note.
Utilizzo di Web Crypto API
Sulla maggior parte delle piattaforme, la raccolta di Web Crypto API è accessibile tramite l'oggetto global crypto
, che include 3 utility di livello superiore: getRandomValues
, randomUUID
e subtle
.
Ci sono molte differenze rispetto al tradizionale modulo crypto. Possono essere riassunte in 3 parti più comuni. Attraversiamoli e vediamo come migrare dal codice esistente.
#1 Generare valori casuali
Nel modulo crypto, puoi generare valori casuali chiamando randomBytes
C'è una funzione simile chiamata getRandomValues
in Web Crypto, ma il valore di ritorno è un ArrayBuffer
, quindi abbiamo bisogno di un altro passaggio per convertirlo in stringa.
#2 Hashing (o digest)
createHash
è facile da usare nel modulo crypto:
In Web Crypto, possiamo usare subtle.createHash
Come puoi vedere, la trasformazione da ArrayBuffer
a stringa esadecimale è anche necessaria.
#3 Cifratura e decifratura
Nel modulo crypto, la cifratura e la decifratura AES possono essere implementate con:
In Web Crypto, dobbiamo creare la chiave con importKey
prima:
Conclusione
Come puoi vedere, la migrazione non è difficile, il lavoro principale è cambiare la sintassi per adattarsi alla nuova API e risolvere ArrayBuffer
con TextEncoder
.
Come prodotto di identità, Logto utilizza la crittografia in molti posti. Abbiamo migrato dal modulo crypto alla Web Crypto API. Questa transizione ci consente di adattarci meglio agli ambienti edge e rende possibile l'esecuzione del codice SDK in modo sicuro nel browser.