Migrering från Node.js crypto till Web Crypto API: En guidad upplevelse
Djupt in i övergångsupplevelsen från crypto till Web Crypto API, tillhandahåller en omfattande guide som fokuserar på 3 vanliga scenarier.
Introduktion
Web Crypto API är ett nytt JavaScript-verktyg för kryptografi. Det är kompatibelt med moderna webbläsare och ledande plattformar, inklusive Cloudflare Workers och Vercel, och även Node.js. En sådan interoperabilitet innebär en utvecklares dröm - skriv din kryptografikod en gång och kör den över många plattformar med hjälp av Web Crypto API.
Men Node.js har redan en "crypto"-modul med en lång historia, vilket lämnar en betydande mängd äldre kod i behov av migration. I denna artikel kommer vi att fördjupa oss i övergångsupplevelsen och tillhandahålla en omfattande guide som fokuserar på 3 vanliga scenarier. Vi siktar på att belysa vägen till en lyckad migration.
Vad är Web Crypto API
Web Crypto API, en öppen standard av W3C för JavaScript, är en samling av standardiserade kryptografiprimitiv definierade i Web Cryptography API-specifikationen. Den skapades efter att flera webbläsare och plattformar började lägga till sina egna icke-interoperabla kryptografifunktioner.
API:et tillhandahåller primitiver för nyckelgenerering, kryptering och dekryptering, digitala signaturer, nyckel- och bitavledning, och kryptografisk digest. Det är centrerat kring ett gränssnitt kallat SubtleCrypto, du kan hitta mer detaljer och handledningar i Mozilla MDN dokumentation.
Men Node.js har redan en crypto-modul?
Node.js-utvecklare är typiskt bekanta med crypto-modulen. Den erbjuder en omfattande uppsättning av kryptografiprimitiver. Denna modul tillhandahåller inte bara mekanismer för samma kryptografiska operationer som definieras i Web Crypto API utan inkluderar ofta ett bredare utbud av kryptografiska algoritmer.
Så varför behöver vi fortfarande Web Crypto API? Eftersom JavaScript blir populärt över många plattformar och miljöer, från klientsidan till servrar och speciellt vid kanten, är det viktigt att ha ett plattformsoberoende kryptografiverktyg för att förenkla processer.
Dessutom returnerar alla funktioner i Web Crypto API standard löften och stöder async/await-syntaxen. Detta är en betydande fördel över crypto-modulen, som är synkron och kan blockera händelseloopen.
Och det finns en intressant sak att Node.js lägger till sitt stöd för Web Crypto API, vilket innebär att, i de flesta fall, Web Crypto API är perfekt på de flesta kända plattformar.
Använda Web Crypto API
På de flesta plattformar är samlingen av Web Crypto API:er tillgänglig via det globala crypto
-objektet, vilket inkluderar 3 toppnivåverktyg: getRandomValues
, randomUUID
och subtle
.
Det finns många skillnader jämfört med den traditionella crypto-modulen. De kan sammanfattas i 3 vanligaste delarna. Låt oss gå igenom dem och se hur man migrerar från befintlig kod.
#1 Generera slumpvärden
I crypto-modulen kan du generera slumpvärden genom att anropa randomBytes
Det finns en liknande funktion som kallas getRandomValues
i Web Crypto, men returvärdet är en ArrayBuffer
, så vi behöver ett annat steg för att konvertera det till en sträng.
#2 Hashing (eller digest)
createHash
är enkel att använda i crypto-modulen:
I Web Crypto kan vi använda subtle.createHash
Som du kan se krävs också omvandlingen från ArrayBuffer
till hex-sträng.
#3 Kryptering och dekryptering
I crypto-modulen kan AES-kryptering och dekryptering implementeras med:
I Web Crypto behöver vi skapa en nyckel med importKey
först:
Slutsats
Som du kan se är migrationen inte svår, huvudarbetet är att ändra syntaxen för att passa det nya API:et och lösa ArrayBuffer
med TextEncoder
.
Som en identitetsprodukt använder Logto kryptografi på många platser. Vi har migrerat från crypto-modulen till Web Crypto API. Denna övergång möjliggör bättre anpassning till kantmiljöer och gör det möjligt att köra SDK-kod säkert i webbläsaren.