Migracja z Node.js crypto do Web Crypto API: Przewodnik krok po kroku
Dogłębne spojrzenie na doświadczenia związane z przejściem z crypto do Web Crypto API, dostarczając obszerny przewodnik skupiający się na 3 najczęściej spotykanych scenariuszach.
Wprowadzenie
Web Crypto API to nowe narzędzie JavaScript do kryptografii. Jest ono kompatybilne z nowoczesnymi przeglądarkami i wiodącymi platformami, w tym Cloudflare Workers i Vercel, a także Node.js. Taka interoperacyjność implikuje marzenie dewelopera - napisz swój kod kryptograficzny raz i uruchom go na wielu platformach za pomocą Web Crypto API.
Jednak Node.js już ma moduł "crypto" o długiej historii, pozostawiając znaczną ilość kodu dziedziczonego, który wymaga migracji. W tym artykule zagłębimy się w doświadczenia z migracji, dostarczając obszerny przewodnik skupiający się na 3 najczęściej spotykanych scenariuszach. Naszym celem jest zilustrowanie drogi do udanej migracji.
Co to jest Web Crypto API
Web Crypto API, otwarty standard W3C dla JavaScript, to zbiór standaryzowanych prymitywów kryptograficznych zdefiniowanych w specyfikacji Web Cryptography API. Powstało po tym, jak wiele przeglądarek i platform zaczęło dodawać swoje własne funkcje kryptograficzne, które nie były zgodne między sobą.
API dostarcza prymitywów do generowania kluczy, szyfrowania i deszyfrowania, podpisów cyfrowych, pochodzenia kluczy i bitów oraz skrótu kryptograficznego. Skupia się wokół interfejsu o nazwie SubtleCrypto, więcej szczegółów i poradników znajdziesz w dokumentacji Mozilla MDN.
Ale Node.js już ma moduł crypto?
Deweloperzy Node.js zazwyczaj są zaznajomieni z modułem crypto. Oferuje on obszerny zestaw prymitywów kryptograficznych. Ten moduł nie tylko dostarcza mechanizmów do tych samych operacji kryptograficznych zdefiniowanych w Web Crypto API, ale często obejmuje szerszy zakres algorytmów kryptograficznych.
Więc dlaczego nadal potrzebujemy Web Crypto API? Ponieważ JavaScript staje się popularny na wielu platformach i w różnych środowiskach, od strony klienta do serwerów i szczególnie na krawędzi, ważne jest posiadanie uniwersalnego narzędzia kryptograficznego, które upraszcza procesy.
Dodatkowo, wszystkie funkcje w standardzie Web Crypto API zwracają obietnice i obsługują składnię async/await. Jest to znacząca przewaga nad modułem crypto, który jest synchroniczny i może blokować pętlę zdarzeń.
A jest coś ciekawego, Node.js dodaje swoje wsparcie dla Web Crypto API, co oznacza, że w większości przypadków Web Crypto API jest idealne na większości znanych platform.
Korzystanie z Web Crypto API
Na większości platform, zbiór Web Crypto API jest dostępny za pośrednictwem globalnego obiektu crypto
, który obejmuje 3 główne narzędzia: getRandomValues
, randomUUID
i subtle
.
Są pewne różnice w porównaniu z tradycyjnym modułem crypto. Mogą one zostać podsumowane w 3 najczęstszych częściach. Przeanalizujmy je i zobaczmy, jak przejść od istniejącego kodu.
#1 Generowanie losowych wartości
W module crypto, możesz generować losowe wartości, wywołując randomBytes
Jest podobna funkcja o nazwie getRandomValues
w Web Crypto, ale wartość zwracana to ArrayBuffer
, więc potrzebujemy dodatkowego etapu, aby przekonwertować go na string.
#2 Hashowanie (czyli skrót)
createHash
jest łatwe do użycia w module crypto:
W Web Crypto można korzystać z subtle.createHash
Jak widzisz, potrzebna jest także transformacja z ArrayBuffer
na łańcuch hex.
#3 Szyfrowanie i deszyfrowanie
W module crypto, AES szyfrowanie i deszyfrowanie mogą być zaimplementowane za pomocą:
W Web Crypto, musimy najpierw utworzyć klucz za pomocą importKey
:
Podsumowanie
Jak widać, migracja nie jest trudna, głównym zadaniem jest zmiana składni, aby dostosować ją do nowego API i obsługiwać ArrayBuffer
z TextEncoder
.
Jako produkt tożsamości, Logto używa kryptografii w wielu miejscach. Przeszliśmy z modułu crypto do Web Crypto API. Ta zmiana pozwoliła nam lepiej dostosować się do środowisk krawędziowych i umożliwiła bezpieczne wykonywanie kodu SDK w przeglądarce.