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.
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.
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.
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.
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.
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.
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.
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.
W module crypto, AES szyfrowanie i deszyfrowanie mogą być zaimplementowane za pomocą:
W Web Crypto, musimy najpierw utworzyć klucz za pomocą importKey:
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.