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
- Saat menandatangani, Anda harus menggunakan
SHA384
sebagai algoritma ringkasan; jangan gunakanSHA1
atauMD5
- Saat mengenkripsi, Anda harus menggunakan
AES256
sebagai algoritma enkripsi simetris; jangan gunakanCAST5
atauIDEA
- Saat mengenkripsi atau menandatangani pesan, pastikan untuk memilih subkunci dengan
tujuan yang sesuai; gunakan kunci
CAN_SIGN
untuk menandatangani dan kunciENCRYPT_COMMS
/ENCRYPT_STORAGE
untuk mengenkripsi
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 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.
- 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
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.
- Diisi di header
alg
(rfc 7518 bagian 3.1).
- Diisi di header
- 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.