Uygulama katmanı şifrelemesi

Standart Ödeme API'leri, uygulama katmanı şifrelemesi için PGP veya JWE'yi destekler.

PGP şifreleme

PGP, kriptografik gizlilik ve kimlik doğrulama sağlayan standart bir şifreleme, şifre çözme ve imzalama algoritma grubudur.

İş ortakları, yük verisini şifrelemek için PGP kullanırken aşağıdakileri desteklemelidir:

  • Birden fazla PGP anahtarıyla yüklerin şifrelenmesi ve şifresi çözülmesi.
  • Yüklemeleri birden fazla PGP anahtarıyla imzalama.
  • Birden fazla imzayla bir yükü doğrulama. Bu imzalar arasında Google tarafından sağlanan anahtarla oluşturulan imza da bulunabilir.
  • Web'de güvenli base64 kodlu yüklerin şifresini çözme.

Google'a sağlanan PGP genel anahtarlarında şifreleme için kullanılan bir alt anahtar olmalıdır. Alt anahtar, ana anahtardan bağımsız olarak döndürülebilir. Ana anahtar, kimlik doğrulama için kullanılır. Gizli anahtarlar, maksimum kullanım süresi iki yıl olan ve bir yıl içinde geçerliliği sona eren 2048 (veya daha yüksek) bit RSA anahtarları olmalıdır.

Geliştirmeye başlamadan önce Google ile PGP anahtarı değiş tokuşu yapmanız gerekir. Bu adımda, bir PGP herkese açık/özel anahtar çifti oluşturur, genel anahtarı Google'a gönderir ve Google'dan bir genel anahtar alırsınız. Geliştirme sırasında, yalnızca geliştirme ve test için kullanılan korumalı alan anahtarlarını üretim dışında değiştirmeniz gerekir. Üretim testinden ve lansmandan önce başka bir üretim anahtarı değişimi yapmanız gerekir.

Yeni bir PGP anahtarı oluşturma

Sistem yolunızda bir GPG ikili dosyası olduğunu varsayarak yeni bir anahtar çifti oluşturmak için aşağıdaki POSIX komutunu kullanabilirsiniz.

$ gpg --full-generate-key

İstendiğinde, en az 2.048 bit entropi ve 1-2 yıllık geçerlilik süresi olan bir RSA anahtarı seçin. Bu komut hem bir ana anahtar ('O'turum açma ve 'S'ertifika oluşturma için SC olarak etiketlenir) hem de bir alt anahtar ('Ş'ifreleme için E olarak etiketlenir) oluşturur.

PGP Kitaplığı Yapılandırması

Yük Gönderme

  1. İmzalama işleminde özet algoritması olarak SHA384 kullanmalısınız. SHA1 veya MD5 kullanmayınız.
  2. Şifreleme yaparken simetrik şifreleme algoritması olarak AES256'ü kullanmalısınız; CAST5 veya IDEA kullanmamalısınız.
  3. Mesajları şifreler veya imzalarken, ilgili amaca sahip alt anahtarı seçtiğinizden emin olun; imzalama için CAN_SIGN anahtarını, şifreleme için ENCRYPT_COMMS/ENCRYPT_STORAGE anahtarını kullanın.

Yük alma

  1. Bir yük doğrularken kitaplığınızın SHA384 gibi modern karma algoritmaları desteklediğinden emin olun. Google, 14 Mayıs 2023'ten itibaren tüm yeni anahtarlarda bu anahtarı kullanmaya başlayacaktır.
  2. Bir yükün şifresini çözerken kitaplığınızın AES256 gibi modern simetrik şifreleme algoritmalarını desteklediğinden emin olun. Google, 14 Mayıs 2023'ten itibaren tüm yeni anahtarlarda bu özelliği kullanmaya başlayacak.

GPG Yük Şifreleme Örneği

Aşağıdaki komut, GPG kullanılırken güvenli seçeneklerin nasıl seçileceğini gösteren bir örnektir. Bu işlemin, kullanıcıların gizli anahtarlara veya hassas giriş dosyalarına erişemediği güvenilir bir ortamda yapılması beklenir.

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

GPG, gerçekleştirmesini istediğiniz her işlem için paketten otomatik olarak doğru anahtarı seçer.

JWS imzalama ile JWE şifreleme

JSON Web Encryption (JWE), içeriği uygulama düzeyinde şifrelemek için rfc7516 tarafından tanımlanan bir standarttır. JSON Web Signature (JWS), içeriği uygulama düzeyinde imzalamak için rfc7515 tarafından tanımlanan bir standarttır.

İstekler ve yanıtlar, "Kompakt Serileştirme" seçeneğiyle asimetrik (herkese açık anahtar) şifreleme kullanılarak şifrelenmiş JWE jetonları olacaktır. JWE jetonu, imzalı yükü JWS jetonu olarak içerir. JWS de asimetrik anahtarlar kullanır. İmzalama için özel anahtar, doğrulama için ortak anahtar kullanılır.

Bir yük gönderirken önce yükü imzalayıp ardından şifreleyin. Bir yük aldığında önce şifresini çöz, ardından imzayı doğrula.

İş ortakları, JWE'yi kullanırken aşağıdaki seçenekleri desteklemelidir:

  • Kompakt Serileştirme.
  • Birden fazla JWE anahtarından birinde bulunan yüklerin şifresini çözme.
  • Anahtar yönetimi için RSA-OAEP, RSA-OAEP-256 veya ECDH-ES algoritması.
  • İçerik şifreleme için A256GCM, A128GCM, A128CBC-HS256 veya A256CBC-HS512 algoritması.
    • enc üstbilgisinde doldurulur.
  • kid başlığını kullanarak ortak şifreleme anahtarını tanımlayabilirsiniz.
  • JWE şifrelemesi kullanan mesaj yükü, application/jose; charset=utf-8 içerik türünü kullanmalıdır.

İş ortakları, JWS'yi kullanırken aşağıdaki seçenekleri desteklemelidir:

  • Kompakt Serileştirme.
  • Birden fazla JWS anahtarından gelen yüklerin doğrulanması.
  • İmza oluşturmak için HS256, HS384, HS512, RS256, RS384, RS512, ES256, PS256, PS384 veya PS512 algoritması.
  • kid üstbilgisini kullanarak özel imzalama anahtarını tanımlayabilirsiniz.

JWE/JWS dizeleri UTF-8 dizesi olarak kodlanır ve bunların yük verileri rastgele baytlar olabilir.

Özel anahtarlar, en fazla iki yıllık bir kullanım ömrü olan ve bir yıl içinde geçerlilik süresi dolan RSA/ECDH-ES anahtarları olmalıdır. Tüm özel anahtar kimlikleri her zaman iş ortağının sunucusunda kalmalıdır ve buna göre tüm imza değerleri iş ortağının sunucusunda hesaplanmalıdır.

Geliştirmeye başlamadan önce JWE ve JWS anahtarlarını Google ile değiş tokuş etmeniz gerekir. Anahtarlar, rfc7517'de tanımlandığı şekilde JWK biçiminde değiştirilmelidir. Bu adımda, bir herkese açık-özel anahtar çifti oluşturur, herkese açık anahtarı Google'a sağlar ve Google'dan bir herkese açık anahtar alırsınız. Geliştirme sırasında, yalnızca geliştirme ve test için kullanılan korumalı alan anahtarlarını üretim dışında değiştirmeniz gerekir. Üretim testinden ve lansmandan önce başka bir üretim anahtarı değişimi yapmanız gerekir.