Enkripsi lapisan aplikasi

Standard Payments API mendukung PGP atau JWE untuk enkripsi lapisan aplikasi.

Enkripsi PGP

PGP adalah serangkaian algoritma enkripsi, dekripsi, dan penandatanganan standar yang memberikan privasi dan autentikasi kriptografis.

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, yang salah satunya dapat berupa tanda tangan dengan kunci yang disediakan oleh Google.
  • Dekripsi payload yang dienkode base64 yang sesuai 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) bit yang berakhir masa berlakunya dalam satu tahun dengan masa aktif maksimum dua tahun.

Sebelum memulai pengembangan, Anda perlu bertukar kunci PGP dengan Google. Pada langkah ini, Anda membuat pasangan kunci publik-pribadi PGP, memberikan kunci publik ke Google, dan menerima kunci publik kembali 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 lainnya.

Membuat kunci PGP baru

Dengan asumsi Anda memiliki biner GPG 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 berlaku 1-2 tahun. Perintah ini akan membuat kunci master (berlabel SC, untuk 'S'igning dan 'C'ertificate generation) dan subkunci (berlabel E, untuk 'E'ncryption).

Konfigurasi Library PGP

Mengirim Payload

  1. Saat menandatangani, Anda harus menggunakan SHA384 sebagai algoritma 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 untuk memilih subkunci 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 mulai 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 mulai 14 Mei 2023.

Contoh Enkripsi Payload GPG

Perintah di bawah adalah contoh cara memilih opsi aman saat menggunakan GPG. Operasi ini diharapkan dilakukan di lingkungan tepercaya tempat 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 untuk dilakukan.

Enkripsi JWE dengan penandatanganan JWS

JSON Web Encryption (JWE) adalah standar yang ditentukan 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, dekripsi terlebih dahulu, lalu verifikasi tanda tangan.

Saat menggunakan JWE, Partner harus mendukung opsi berikut:

  • Serialisasi Rapat.
  • Mendekripsi payload dari salah satu dari beberapa kunci JWE.
  • Algoritma RSA-OAEP, RSA-OAEP-256, atau ECDH-ES untuk pengelolaan kunci.
  • Algoritma 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 Rapat.
  • 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 masa berlakunya satu tahun dengan masa aktif maksimum dua tahun. Semua identitas kunci pribadi harus selalu berada di server partner dan, dengan demikian, 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 ditentukan dalam rfc7517. Pada langkah ini, Anda membuat pasangan kunci publik-pribadi, memberikan kunci publik ke Google, dan menerima kunci publik kembali 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 lainnya.