Migreren van Node.js crypto naar Web Crypto API: Een begeleide ervaring
Diep in de overgangservaring van crypto naar Web Crypto API, met een uitgebreide gids die zich richt op 3 veelvoorkomende scenario's.
Inleiding
De Web Crypto API is een nieuwe JavaScript-tool voor cryptografie. Het is compatibel met moderne browsers en toonaangevende platforms, waaronder Cloudflare Workers en Vercel, en ook Node.js. Deze interoperabiliteit impliceert een droom voor ontwikkelaars - schrijf je cryptografiecode één keer en voer deze uit op tal van platforms met behulp van de Web Crypto API.
Node.js heeft echter al een "crypto"-module met een lange geschiedenis, waardoor er een aanzienlijke hoeveelheid legacycode moet worden gemigreerd. In dit artikel zullen we dieper ingaan op de overgangservaring en een uitgebreide gids bieden die zich richt op 3 veelvoorkomende scenario's. We streven ernaar de weg naar een succesvolle migratie te verlichten.
Wat is Web Crypto API
Web Crypto API, een open standaard van W3C voor JavaScript, is een verzameling gestandaardiseerde cryptografieprimitieven gedefinieerd in de Web Cryptography API-specificatie. Deze werd ontwikkeld nadat verschillende browsers en platforms hun eigen niet-interoperabele cryptografiefuncties begonnen toe te voegen.
De API biedt primitieven voor sleutelgeneratie, versleuteling en ontsleuteling, digitale handtekeningen, sleutel- en bitherderivatie en cryptografische samenvattingen. Het is gecentreerd rond een interface genaamd SubtleCrypto, je kunt meer details en tutorials vinden in de Mozilla MDN documentatie.
Maar Node.js heeft al een crypto-module?
Node.js-ontwikkelaars zijn meestal vertrouwd met de crypto-module. Het biedt een uitgebreide set cryptografische primitieven. Deze module biedt niet alleen mechanismen voor dezelfde cryptografische bewerkingen gedefinieerd in de Web Crypto API, maar omvat vaak ook een breder scala aan cryptografische algoritmen.
Dus waarom hebben we nog steeds de Web Crypto API nodig? Aangezien JavaScript populair wordt op veel platforms en omgevingen, van de client-side tot servers en vooral aan de rand, is het belangrijk om een platformonafhankelijk cryptografisch hulpmiddel te hebben om processen te vereenvoudigen.
Bovendien geven de functies in de Web Crypto API standaard allemaal beloften terug en ondersteunen ze de async/await-syntax. Dit is een significant voordeel ten opzichte van de crypto-module, die synchroon is en de eventloop kan blokkeren.
En er is een interessant feit dat Node.js zijn ondersteuning toevoegt voor de Web Crypto API, wat betekent dat de Web Crypto API in de meeste bekende platforms perfect is.
Gebruik van de Web Crypto API
Op de meeste platforms is de verzameling Web Crypto API's toegankelijk via het globale crypto
-object, dat 3 topniveaufuncties bevat: getRandomValues
, randomUUID
en subtle
.
Er zijn veel verschillen vergeleken met de traditionele crypto-module. Ze kunnen worden samengevat in de 3 meest voorkomende delen. Laten we ze doornemen en kijken hoe we kunnen migreren van bestaande code.
#1 Genereer willekeurige waarden
In de crypto-module kun je willekeurige waarden genereren door randomBytes
aan te roepen
Er is een vergelijkbare functie genaamd getRandomValues
in Web Crypto, maar de retourwaarde is een ArrayBuffer
, dus we hebben een extra stap nodig om deze naar een string te converteren.
#2 Hashing (of digest)
createHash
is gemakkelijk te gebruiken in de crypto-module:
In Web Crypto kunnen we subtle.createHash
gebruiken
Zoals je kunt zien, is de transformatie van ArrayBuffer
naar hex-string ook nodig.
#3 Versleuteling en ontsleuteling
In de crypto-module kunnen AES-versleuteling en -ontsleuteling worden geïmplementeerd met:
In Web Crypto moeten we eerst een sleutel maken door importKey
te gebruiken:
Conclusie
Zoals je kunt zien, is de migratie niet moeilijk, de belangrijkste taak is het aanpassen van de syntax om aan de nieuwe API te voldoen en ArrayBuffer
op te lossen met TextEncoder
.
Als een identiteitsproduct gebruikt Logto op veel plaatsen cryptografie. We zijn gemigreerd van de crypto-module naar de Web Crypto API. Deze overgang stelt ons in staat om beter aan te passen aan randomgevingen en maakt het mogelijk om SDK-code veilig in de browser uit te voeren.