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 ładunku za pomocą wielu podpisów, z których każdy może być podpisem z kluczem udostępnionym 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 plik binarny GPG 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).
Rotacja kluczy
Aby zapewnić nieprzerwane działanie usługi podczas rotacji kluczy, system obsługuje wiele aktywnych kluczy PGP zarówno dla partnerów, jak i dla Google.
Podczas rotacji możesz podpisywać ładunki zarówno starymi, jak i nowymi kluczami. Google zweryfikuje podpis za pomocą lub dowolnego aktywnego klucza publicznego, który Google ma w swoich plikach.
Gdy musisz rotować klucze publiczne Google, możesz szyfrować ładunki zarówno starymi, jak i nowymi kluczami publicznymi Google. Google może odszyfrować ładunek za pomocą dowolnego klucza.
Identyfikatory kluczy PGP w samej wiadomości umożliwiają automatyczne rozpoznawanie kluczy, co eliminuje potrzebę stosowania pól wersji ładunku lub skoordynowanych czasów przełączania.
Konfiguracja biblioteki PGP
Wysyłanie ładunków
- Podczas podpisywania pliku należy użyć algorytmu
SHA384. Nie używaj algorytmuSHA1aniMD5. - W przypadku szyfrowania użyj algorytmu szyfrowania symetrycznego
AES256. Nie używaj algorytmuCAST5aniIDEA. - Podczas szyfrowania lub podpisywania wiadomości wybierz klucz podrzędny o odpowiednim przeznaczeniu. Do podpisywania użyj klucza
CAN_SIGN, a do szyfrowania kluczaENCRYPT_COMMSlubENCRYPT_STORAGE.
Odbieranie ładunków
- Weryfikując ładunek, sprawdź, czy Twoja biblioteka obsługuje nowoczesne algorytmy haszujące, takie jak
SHA384. Google zacznie go używać we wszystkich nowych kluczach od 14 maja 2023 r. - Odszyfrowując ładunek, sprawdź, czy Twoja biblioteka obsługuje nowoczesne algorytmy szyfrowania symetrycznego, takie jak
AES256. Google zacznie go używać we wszystkich nowych kluczach od 14 maja 2023 r.
Przykład szyfrowania ładunku za pomocą GPG
Poniższe polecenie pokazuje, jak wybrać bezpieczne opcje podczas korzystania z GPG. Ta operacja powinna być przeprowadzana w zaufanym środowisku, w którym użytkownicy 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 odpowiedni klucz z pakietu dla każdej operacji, o którą poprosisz.
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ą tokenami JWE zaszyfrowanymi za pomocą algorytmu asymetrycznego (klucz publiczny) z opcją „kompaktowej serializacji”. Token JWE będzie zawierać podpisany ładunek jako token JWS. W standardzie JWS również używane są klucze asymetryczne: klucz prywatny do podpisywania i klucz publiczny do weryfikacji.
Wysyłając ładunek, najpierw go podpisz, a potem zaszyfruj. Odbierając ładunek, najpierw go odszyfruj, a potem zweryfikuj 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.
- Wypełniony w nagłówku
alg(rfc7518 sekcja 4.1).
- Wypełniony w nagłówku
- algorytm A256GCM,
A128GCM,
A128CBC-HS256 lub
A256CBC-HS512
do szyfrowania treści.
- Wypełniony w nagłówku
enc.
- Wypełniony w nagłówku
- nagłówek
kiddo identyfikowania publicznego klucza szyfrowania. - Ładunki komunikatów, które używają szyfrowania JWE, muszą korzystać z treści typu application/jose; charset=utf-8.
Aby weryfikować ładunki przy użyciu tokena JWS, partnerzy muszą obsługiwać te opcje:
- kompaktowa serializacja,
- weryfikowanie ładunków z jednego z wielu kluczy JWS,
- algorytm HS256, HS384, HS512, RS256, RS384, RS512, ES256, PS256, PS384 lub PS512 do tworzenia podpisów.
- Wypełniony w nagłówku
alg(rfc 7518 sekcja 3.1).
- Wypełniony w nagłówku
- nagłówek
kiddo identyfikowania prywatnego klucza podpisywania.
Ciągi znaków JWE/JWS będą kodowane jako ciągi znaków UTF-8, a ich ładunki mogą być dowolnymi bajtami.
Klucze prywatne muszą być kluczami RSA/ECDH-ES 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.
Przed rozpoczęciem programowania należy wymienić klucze JWE i JWS z Google. Klucze należy wymieniać w formacie JWK, zgodnie z definicją w rfc7517. 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.