Enkripsi lapisan aplikasi

API Pembayaran Standar mendukung PGP atau JWE untuk enkripsi lapisan aplikasi.

Enkripsi PGP

PGP adalah kumpulan standar algoritma enkripsi, dekripsi, dan penandatanganan yang menyediakan privasi dan autentikasi kriptografi.

Saat menggunakan PGP untuk mengenkripsi payload, partner harus mendukung:

  • Mengenkripsi dan mendekripsi payload dengan beberapa kunci PGP.
  • Menandatangani payload dengan beberapa kunci PGP.
  • Memverifikasi payload dengan beberapa tanda tangan, salah satunya dapat berupa tanda tangan dengan kunci yang disediakan oleh Google.
  • Dekripsi payload berenkode base64 yang aman untuk Web.

Kunci publik PGP yang diberikan kepada Google harus memiliki subkunci yang digunakan untuk enkripsi. Subkunci memungkinkan rotasi independen dari kunci master. Kunci master digunakan untuk verifikasi identitas. Kunci pribadi harus berupa kunci RSA 2048 (atau lebih tinggi) bit yang berakhir dalam satu tahun dengan masa pakai maksimum dua tahun.

Sebelum memulai pengembangan, Anda perlu bertukar kunci PGP dengan Google. Pada langkah ini, Anda akan membuat pasangan kunci publik-pribadi PGP, memberikan kunci publik ke Google, dan menerima kembali kunci publik dari Google. Selama pengembangan, Anda hanya perlu menukar kunci sandbox yang digunakan untuk pengembangan dan pengujian di luar produksi. Sebelum pengujian dan peluncuran produksi, Anda harus melakukan pertukaran kunci produksi lagi.

Membuat kunci PGP baru

Dengan asumsi Anda memiliki biner GGP di jalur sistem, Anda dapat menggunakan perintah POSIX berikut untuk membuat pasangan kunci baru.

$ gpg --full-generate-key

Saat diminta, pilih kunci RSA dengan entropi minimal 2048 bit dan masa berlakunya akan habis selama 1-2 tahun. Perintah ini akan membuat kunci master (berlabel SC, untuk 'S'igning dan 'C'ertificategeneration) serta subkunci (berlabel E, untuk 'E'ncryption).

Konfigurasi Library PGP

Mengirim Payload

  1. Saat menandatangani, Anda harus menggunakan SHA384 sebagai algoritme ringkasan; jangan gunakan SHA1atau MD5
  2. Saat mengenkripsi, Anda harus menggunakan AES256 sebagai algoritma enkripsi simetris; jangan gunakan CAST5 atau IDEA
  3. Saat mengenkripsi atau menandatangani pesan, pastikan Anda memilih sub-kunci dengan tujuan yang sesuai. Gunakan kunci CAN_SIGN untuk menandatangani dan kunci ENCRYPT_COMMS/ENCRYPT_STORAGE untuk mengenkripsi

Menerima Payload

  1. Saat memverifikasi payload, pastikan library Anda mendukung algoritma hash modern seperti SHA384. Google akan mulai menggunakannya di semua kunci baru per 14 Mei 2023.
  2. Saat mendekripsi payload, pastikan library Anda mendukung algoritma enkripsi simetris modern seperti AES256. Google akan mulai menggunakannya di semua kunci baru per 14 Mei 2023.

Contoh Enkripsi Payload GPG

Perintah di bawah adalah contoh cara memilih opsi aman saat menggunakan GPG. Operasi ini diharapkan akan dilakukan di lingkungan tepercaya, yang memungkinkan orang tidak memiliki akses ke kunci pribadi atau file input sensitif.

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

GPG akan otomatis memilih kunci yang tepat dari paket untuk setiap operasi yang Anda minta.

Enkripsi JWE dengan penandatanganan JWS

JSON Web Encryption (JWE) adalah standar yang ditetapkan oleh rfc7516 untuk mengenkripsi konten di tingkat aplikasi. JSON Web Signature (JWS) adalah standar yang ditentukan oleh rfc7515 untuk menandatangani konten di tingkat aplikasi.

Permintaan dan respons akan berupa token JWE yang dienkripsi menggunakan enkripsi asimetris (kunci publik) dengan opsi "Serialisasi Ringkas". Token JWE akan berisi payload yang ditandatangani sebagai token JWS. JWS juga menggunakan kunci asimetris; kunci pribadi untuk penandatanganan dan kunci publik untuk verifikasi.

Saat mengirim payload, tanda tangani payload terlebih dahulu, lalu enkripsi. Saat menerima payload, dekripsinya terlebih dahulu, lalu verifikasi tanda tangan tersebut.

Saat menggunakan JWE, Partner harus mendukung opsi berikut:

  • Serialisasi Ringkas.
  • Mendekripsi payload dari salah satu dari beberapa kunci JWE.
  • Algoritma RSA-OAEP, RSA-OAEP-256, atau ECDH-ES untuk pengelolaan kunci.
  • Algoritme A256GCM, A128GCM, A128CBC-HS256, atau A256CBC-HS512 untuk enkripsi konten.
    • Diisi di header enc.
  • Header kid untuk mengidentifikasi kunci enkripsi publik.
  • Payload pesan yang menggunakan enkripsi JWE harus menggunakan jenis konten application/jose; charset=utf-8.

Saat menggunakan JWS, Partner harus mendukung opsi berikut:

  • Serialisasi Ringkas.
  • Memverifikasi payload dari salah satu dari beberapa kunci JWS.
  • Algoritma HS256, HS384, HS512, RS256, RS384, RS512, ES256, PS256, PS384, atau PS512 untuk pembuatan tanda tangan.
  • Header kid untuk mengidentifikasi kunci penandatanganan pribadi.

String JWE/JWS akan dienkode sebagai string UTF-8 dan payload-nya dapat berupa byte arbitrer.

Kunci pribadi harus berupa kunci RSA/ECDH-ES yang habis masa berlakunya dalam waktu satu tahun dengan masa pakai maksimal dua tahun. Semua identitas kunci pribadi harus selalu berada di server partner, dan karenanya, semua nilai tanda tangan harus dihitung di server partner.

Sebelum memulai pengembangan, Anda perlu bertukar kunci JWE dan JWS dengan Google. Kunci harus dipertukarkan dalam format JWK, seperti yang dijelaskan dalam rfc7517. Pada langkah ini, Anda akan membuat pasangan kunci publik-pribadi, memberikan kunci publik ke Google, dan menerima pengembalian kunci publik dari Google. Selama pengembangan, Anda hanya perlu menukar kunci sandbox yang digunakan untuk pengembangan dan pengujian di luar produksi. Sebelum pengujian dan peluncuran produksi, Anda harus melakukan pertukaran kunci produksi lagi.