Enkripsi PGP
PGP adalah kumpulan standar algoritma enkripsi, dekripsi, dan penandatanganan yang memberikan privasi dan autentikasi kriptografi.
Saat menggunakan PGP untuk mengenkripsi payload, partner harus mendukung:
- Enkripsi dan dekripsi payload dengan beberapa kunci PGP.
- Penandatanganan payload dengan beberapa kunci PGP.
- Verifikasi payload dengan beberapa tanda tangan, yang salah satunya dapat berupa tanda tangan dengan kunci yang disediakan oleh Google.
- Dekripsi payload berenkode 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 utama. Kunci utama digunakan untuk verifikasi identitas. Kunci pribadi harus berupa kunci RSA 2048 bit (atau lebih besar) yang masa berlakunya satu tahun dengan masa berlaku maksimum dua tahun.
Sebelum memulai pengembangan, Anda harus menukar kunci PGP dengan Google. Pada langkah ini, Anda akan membuat pasangan kunci publik-pribadi PGP, memberikan kunci publik kepada Google, dan menerima 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 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 utama (berlabel SC, untuk pembuatan 'S'ignature dan 'C'ertificate) dan subkunci (berlabel E, untuk 'E'ncryption).
Konfigurasi Library PGP
Mengirim Payload
- Saat menandatangani, Anda harus menggunakan
SHA384sebagai algoritma ringkasan; jangan gunakanSHA1atauMD5 - Saat mengenkripsi, Anda harus menggunakan
AES256sebagai algoritma enkripsi simetris; jangan gunakanCAST5atauIDEA - Saat mengenkripsi atau menandatangani pesan, pastikan untuk memilih subkunci dengan tujuan yang sesuai; gunakan kunci
CAN_SIGNuntuk penandatanganan dan kunciENCRYPT_COMMS/ENCRYPT_STORAGEuntuk enkripsi
Menerima Payload
- Saat memverifikasi payload, pastikan library Anda mendukung algoritma hash modern seperti
SHA384. Google akan mulai menggunakannya di semua kunci baru mulai 14 Mei 2023. - 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 berikut adalah contoh cara memilih opsi yang 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.
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 Ringkas.
- Dekripsi payload dari salah satu dari beberapa kunci JWE.
- Algoritma RSA-OAEP, RSA-OAEP-256, atau ECDH-ES untuk pengelolaan kunci.
- Diisi di header
alg(rfc7518 bagian 4.1).
- Diisi di header
- Algoritma A256GCM,
A128GCM,
A128CBC-HS256, atau
A256CBC-HS512
untuk enkripsi konten.
- Diisi di header
enc.
- Diisi di header
- Header
kiduntuk 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.
- Verifikasi payload dari salah satu dari beberapa kunci JWS.
- Algoritma HS256, HS384, HS512, RS256, RS384, RS512, ES256, PS256, PS384, atau PS512 untuk pembuatan tanda tangan.
- Diisi di header
alg(rfc 7518 bagian 3.1).
- Diisi di header
- Header
kiduntuk 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 berlaku maksimum dua tahun. Semua identitas kunci pribadi harus selalu berada di server partner dan, oleh karena itu, semua nilai tanda tangan harus dihitung di server partner.
Sebelum memulai pengembangan, Anda harus menukar kunci JWE dan JWS dengan Google. Kunci harus ditukar dalam format JWK, seperti yang ditentukan dalam rfc7517. Pada langkah ini, Anda akan membuat pasangan kunci publik-pribadi, memberikan kunci publik kepada Google, dan menerima 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 lainnya.