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 algoritmaları kümesidir.

PGP'yi kullanarak yükleri şifrelerken iş ortakları şunları desteklemelidir:

  • Birden fazla PGP anahtarıyla yükleri şifreleme ve yüklerin şifresini çözme.
  • Yükleri birden fazla PGP anahtarıyla imzalama.
  • Birden fazla imzası olan bir yükü doğrulama. Bu imzalardan herhangi biri, Google tarafından sağlanan anahtarla imzalanmış olabilir.
  • Web güvenli Base64 kodlu yüklerin şifresini çözme.

Google'a sağlanan PGP ortak anahtarlarında şifreleme için kullanılan bir alt anahtar olmalıdır. Alt anahtar, birincil anahtardan bağımsız olarak döndürülebilir. Birincil anahtar, kimlik doğrulama için kullanılır. Özel anahtarlar, bir yıl içinde geçerliliği dolan ve maksimum iki yıl geçerlilik süresine sahip 2048 bit (veya daha büyük) RSA anahtarları olmalıdır.

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

Yeni bir PGP anahtarı oluşturma

Sistem yolunuzda GPG ikili programı olduğunu varsayarsak 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 içeren ve 1-2 yıl geçerliliği olan bir RSA anahtarı seçin. Bu komut hem birincil anahtar (SC olarak etiketlenir, "S"ignature ve "C"ertificate generation) hem de alt anahtar (E olarak etiketlenir, "E"ncryption) oluşturmalıdır.

PGP Kitaplığı Yapılandırması

Yük Gönderme

  1. İmzalarken özet algoritması olarak SHA384 kullanmanız gerekir. SHA1 veya MD5 kullanmayın.
  2. Şifreleme yaparken simetrik şifreleme algoritması olarak AES256 kullanmanız gerekir. CAST5 veya IDEA kullanmayın.
  3. İletileri şifrelerken veya imzalarken ilgili amaca uygun alt anahtarı seçtiğinizden emin olun. İmzalama için CAN_SIGN anahtarını, şifreleme için ise 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ını desteklediğinden emin olun. Google, 14 Mayıs 2023'ten itibaren tüm yeni anahtarlarda bu yöntemi kullanmaya başlayacak.
  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ırken güvenli seçeneklerin nasıl belirleneceğine dair 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 paketteki doğru anahtarı otomatik olarak seçer.

JWS imzalama ile JWE şifrelemesi

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

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

Bir yük gönderirken önce yükü imzalayın, ardından şifreleyin. Bir yük alırken önce yükün şifresini çözün, ardından imzayı doğrulayın.

JWE kullanırken İş Ortakları aşağıdaki seçenekleri desteklemelidir:

  • Compact Serialization.
  • Birden fazla JWE anahtarından birindeki 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.
  • Ortak şifreleme anahtarını tanımlamak için kid üstbilgisi.
  • JWE şifrelemesi kullanan ileti yükleri, içerik türü olarak application/jose; charset=utf-8 değerini kullanmalıdır.

JWS kullanırken İş Ortakları aşağıdaki seçenekleri desteklemelidir:

  • Compact Serialization.
  • Birden fazla JWS anahtarından birindeki yükleri doğrulama.
  • İmza oluşturma için HS256, HS384, HS512, RS256, RS384, RS512, ES256, PS256, PS384 veya PS512 algoritması.
  • Özel imzalama anahtarını tanımlamak için kid üstbilgisi.

JWE/JWS dizeleri UTF-8 dizeleri olarak kodlanır ve yükleri rastgele baytlar olabilir.

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

Geliştirmeye başlamadan önce Google ile JWE ve JWS anahtarlarını paylaşmanız gerekir. Anahtarlar, rfc7517'de tanımlandığı gibi JWK biçiminde değiştirilmelidir. Bu adımda, herkese açık/özel anahtar çifti oluşturur, herkese açık anahtarı Google'a gönderir ve Google'dan herkese açık anahtarı geri alırsınız. Geliştirme sırasında, üretim dışında geliştirme ve test için kullanılan korumalı alan anahtarlarını değiştirmeniz yeterlidir. Üretim testi ve lansmandan önce üretim anahtarlarının başka bir değişimini yapmanız gerekir.