Szyfrowanie w warstwie aplikacji

Interfejsy API jednorazowego kodu płatności obsługują PGP lub JWE do szyfrowania w warstwie aplikacji.

Szyfrowanie PGP

PGP to standardowy zestaw algorytmów szyfrowania, odszyfrowywania i podpisywania, które zapewniają prywatność i uwierzytelnianie kryptograficzne.

Partnerzy korzystający ze standardu PGP do szyfrowania ładunków muszą obsługiwać:

  • szyfrowanie i odszyfrowywanie ładunków za pomocą wielu kluczy PGP;
  • podpisywanie ładunków za pomocą wielu kluczy PGP;
  • weryfikowanie ładunków z wieloma podpisami, z których każdy może korzystać z klucza dostarczonego przez Google;
  • odszyfrowywanie bezpiecznych dla sieci ładunków zakodowanych w standardzie base64.

Klucze publiczne PGP przekazywane do Google muszą mieć klucz podrzędny używany do szyfrowania. Klucz podrzędny umożliwia rotację niezależną od klucza głównego. Klucz główny służy do weryfikacji tożsamości. Klucze prywatne muszą być 2048-bitowymi (lub dłuższymi) kluczami RSA o rocznym terminie ważności i maksymalnie dwuletnim okresie użytkowania.

Przed rozpoczęciem programowania należy wymienić klucze PGP z Google. W tym celu należy wygenerować parę kluczy PGP (publiczny-prywatny), przekazać Google swój klucz publiczny i otrzymać klucz publiczny od Google. Podczas programowania wystarczy wymienić klucze piaskownicy używane do programowania i testowania poza produkcją. Przed testami produkcyjnymi i premierą musisz przeprowadzić kolejną wymianę kluczy produkcyjnych.

Generowanie nowego klucza PGP

Zakładając, że kod binarny PGP jest dostępny w ścieżce systemowej, do utworzenia nowej pary kluczy możesz użyć poniższego polecenia POSIX.

$ gpg --full-generate-key

Gdy pojawi się odpowiedni komunikat, wybierz klucz RSA o co najmniej 2048-bitowej entropii i terminie ważności od 1 do 2 lat. Polecenie to powinno utworzyć klucz główny (oznaczony SC: Signing and Certificate generation – podpisywanie i generowanie certyfikatów) oraz klucz podrzędny (oznaczony E: Encryption – szyfrowanie).

Szyfrowanie JWE

JWE (JSON Web Encryption) to standard zdefiniowany w rfc7516 służący do szyfrowania treści na poziomie aplikacji.

Partnerzy korzystający ze standardu JWE do szyfrowania ładunków muszą obsługiwać te opcje:

  • odszyfrowywanie ładunków z jednego z wielu kluczy JWE,
  • kompaktowa serializacja,
  • kompresja JWE (np. zip=„DEF”),
  • algorytm RSAES-PKCS1-V1_5 do zarządzania kluczami,
  • algorytm AES-CBC + HMAC-SHA2 do szyfrowania treści.

Klucze prywatne muszą być kluczami RSA o rocznym terminie ważności i maksymalnie dwuletnim okresie użytkowania. Wszystkie tożsamości kluczy prywatnych muszą zawsze pozostawać na serwerze partnera, a tym samym wszystkie wartości podpisu muszą być obliczane na serwerze partnera.

Klient i serwer szyfrują treść JSON zgodnie ze specyfikacją JSON Web Encryption (JWE). Cała treść żądania POST lub odpowiedzi jest tokenem JWE wykorzystującym opcję „kompaktowej serializacji” JWE.

Przed rozpoczęciem programowania należy wymienić klucze JWE z Google. W tym celu należy wygenerować parę kluczy publiczny-prywatny, przekazać Google swój klucz publiczny i otrzymać klucz publiczny od Google. Podczas programowania wystarczy wymienić klucze piaskownicy używane do programowania i testowania poza produkcją. Przed testami produkcyjnymi i premierą musisz przeprowadzić kolejną wymianę kluczy produkcyjnych.

Partnerzy muszą obsługiwać wysyłanie i odbieranie wiadomości przy użyciu kompresji JWE (np. zip=„DEF”). Żądania i odpowiedzi będą szyfrowane z użyciem algorytmu asymetrycznego (klucz publiczny) i wzajemnie wymienionych kluczy JWE. Dodatkowo wraz ze standardem JWE można stosować weryfikację podpisu JWS, przy czym treść jest podpisywana przed zaszyfrowaniem, a weryfikowana po odszyfrowaniu. W standardzie JWS również używane są klucze asymetryczne: klucz prywatny do podpisywania i klucz publiczny do weryfikacji.