Szyfrowanie w warstwie aplikacji

Standardowe interfejsy API płatności obsługują protokół 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 wieloma kluczami PGP.
  • weryfikowanie ładunku z wieloma podpisami, z których każdy może być podpisem klucza dostarczonym przez Google;
  • Odszyfrowywanie ładunków zakodowanych w internecie w standardzie base64.

Klucze publiczne PGP udostępnione Google muszą mieć klucz podrzędny używany do szyfrowania. Klucz podrzędny umożliwia niezależną rotację 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, których wygasają po roku i maksymalnie 2 latach.

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. W trakcie programowania wystarczy wymienić klucze piaskownicy, które są używane do programowania i testowania poza środowiskiem produkcyjnym. 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: Szyfrowanie E: szyfrowanie).

Konfiguracja biblioteki PGP

Wysyłanie ładunków

  1. Do podpisywania należy używać algorytmu skrótu SHA384, a nie SHA1ani MD5
  2. W przypadku szyfrowania użyj algorytmu szyfrowania symetrycznego AES256. Nie używaj algorytmu CAST5 ani IDEA.
  3. W przypadku szyfrowania lub podpisywania wiadomości pamiętaj, aby wybrać klucz podrzędny o odpowiednim przeznaczeniu. Użyj klucza CAN_SIGN do podpisywania i klucza ENCRYPT_COMMS/ENCRYPT_STORAGE do szyfrowania

Odbieranie ładunków

  1. Weryfikując ładunek, sprawdź, czy Twoja biblioteka obsługuje nowoczesne algorytmy haszujące, takie jak SHA384. Od 14 maja 2023 r. Google będzie używać go we wszystkich nowych kluczach.
  2. Odszyfrowując ładunek, sprawdź, czy Twoja biblioteka obsługuje nowoczesne algorytmy szyfrowania symetrycznego, takie jak AES256. Od 14 maja 2023 r. Google będzie używać go we wszystkich nowych kluczach.

Przykład szyfrowania ładunku GPG

Poniżej znajdziesz przykład wyboru bezpiecznych opcji w GPG. Ta operacja powinna być wykonywane w zaufanym środowisku, w którym ludzie nie mają dostępu do kluczy prywatnych ani poufnych plików wejściowych.

gpg --output signed-and-encrypted.pgp \
  --sign --digest-algo SHA384 \
  --encrypt --cipher-algo AES256 \
  --armor \
  --recipient {key_id} \
  input.txt

GPG automatycznie wybierze właściwy klucz dla pakietu w przypadku każdej operacji, którą chcesz wykonać.

Szyfrowanie JWE przy użyciu podpisywania JWS

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

Żądania i odpowiedzi będą szyfrowane tokenami JWE przy użyciu szyfrowania asymetrycznego (klucza publicznego) z opcją „kompaktowa serializacja”. Token JWE będzie zawierać podpisany ładunek jako token JWS. JWS wykorzystuje też klucze asymetryczne: klucz prywatny do podpisywania i klucz publiczny do weryfikacji.

Wysyłając ładunek, najpierw go podpisz, a potem zaszyfruj. Gdy odbierasz ładunek, odszyfruj go, a potem sprawdź podpis.

Partnerzy korzystający ze standardu JWE muszą obsługiwać te opcje:

  • kompaktowa serializacja,
  • odszyfrowywanie ładunków z jednego z wielu kluczy JWE,
  • algorytm RSA-OAEP, RSA-OAEP-256 lub ECDH-ES do zarządzania kluczem.
  • algorytm A256GCM, A128GCM, A128CBC-HS256 lub A256CBC-HS512 do szyfrowania treści.
    • Wprowadzane w nagłówku enc.
  • kid do identyfikacji publicznego klucza szyfrowania.
  • Ładunki wiadomości, które korzystają z szyfrowania JWE, muszą używać typu treściapplication/jose: charset=utf-8.

Partnerzy korzystający ze standardu JWS muszą obsługiwać te opcje:

  • kompaktowa serializacja,
  • Weryfikuję ładunki z jednego z wielu kluczy JWS.
  • Algorytm HS256, HS384, HS512, RS256, RS384, RS512, ES256, PS256, PS384 lub PS512 do tworzenia podpisu.
  • kid do identyfikacji prywatnego klucza podpisywania.

Ciągi JWE/JWS zostaną zakodowane jako ciągi UTF-8, a ich ładunki mogą mieć postać dowolnych bajtów.

Klucze prywatne muszą być kluczami RSA/ECDH-ES, których ważność wygasa po roku i maksymalny czas ważności to 2 lata. 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.

Przed rozpoczęciem programowania należy wymienić klucze JWE i JWS z Google. Klucze należy wymieniać w formacie JWK, zgodnie z definicją w dokumencie rfc7517. W tym celu należy wygenerować parę kluczy publiczny-prywatny, przekazać Google swój klucz publiczny i otrzymać klucz publiczny od Google. W trakcie programowania wystarczy wymienić klucze piaskownicy, które są używane do programowania i testowania poza środowiskiem produkcyjnym. Przed testami produkcyjnymi i premierą musisz przeprowadzić kolejną wymianę kluczy produkcyjnych.