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
- Saat menandatangani, Anda harus menggunakan
SHA384
sebagai algoritme ringkasan; jangan gunakanSHA1
atauMD5
- Saat mengenkripsi, Anda harus menggunakan
AES256
sebagai algoritma enkripsi simetris; jangan gunakanCAST5
atauIDEA
- Saat mengenkripsi atau menandatangani pesan, pastikan Anda memilih sub-kunci 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 per 14 Mei 2023. - 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.
- Diisi di header
alg
(rfc7518 bagian 4.1).
- Diisi di header
- Algoritme 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 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.
- 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 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.