Skip to content

Instantly share code, notes, and snippets.

@RioChndr
Last active December 4, 2025 04:07
Show Gist options
  • Select an option

  • Save RioChndr/df9d97d774f8bc07556bf72324ea8748 to your computer and use it in GitHub Desktop.

Select an option

Save RioChndr/df9d97d774f8bc07556bf72324ea8748 to your computer and use it in GitHub Desktop.
Client-side Encryption
date title
Thu Dec 4 09:26:53 WIB 2025
Client Side Encryption

Penggunaan aplikasi harus aman dan pemilik server tidak perlu tahu isi data dari pengguna. Pembuatan client-side encryption dilakukan untuk enkripsi data sebelum dikirim ke server sehingga fungsi server hanya untuk penyimpanan chiper saja. Tujuan tulisan ini adalah untuk membuat panduan arsitektur enkripsi yang cukup untuk company kecil ke medium, dan tidak cocok untuk perusahaan besar karena harus memiliki compliance dan standar yang harus diikut. Berikut arsitektur enkripsi sederhana, masih dalam tahap pengembangan.

Multi-device encryption

Katakanlah Budi enkripsi data p1 di perangkat d1 dengan kunci k1, lalu kirim chiper tersebut ke server. server menyimpannya tanpa tahu kunci k1.

Budi ingin login dari perangkat lain d2, maka budi harus menggunakan k1 tetapi hanya tersimpan di d1. Maka perlu gunakan KDF untuk membuat kunci baru. Budi memiliki kunci kBudi yang budi ingat, lalu generate k1 (k1 = KDF(kBudi, salt)) untuk enkripsi data. lalu membuat ck1 menggunakan kBudi (ck1 = CW(k1, kBudi)) untuk disimpan di server.

KDF = Key Derivation Function, untuk membuat kunci baru dengan entrophy lebih tinggi CW = Cryptographic Wrapping, proses cryptografi terhadap kunci menggunakan kunci lain.

Dengan begitu, di perangkat lain budi akan download ck1 untuk DCW (Decrypt CW) menggunakan kBudi (k1 = DCW(ck1, kBudi)), kemudian dekripsi seluruh data menggunakan k1.

Sharing key

Budi ingin membagikan data p1 ke Andi, maka budi harus mengirim k1 ke andi. Tetapi k1 tidak boleh dikirim secara langsung, karena k1 adalah kunci yang dimiliki budi dan tidak boleh diketahui orang lain, maka diubah konsep k1 menjadi kunci hanya untuk kelompok data tersebut. kGroup yaitu nama kunci untuk kelompok data p1. Mulai dari sini, k1 tidak digunakan lagi

kGroup harus dibagikan ke budi dan andi, maka kGroup dienkripsi menggunakan kunci masing-masing pengguna. Budi mengenkripsi kGroup menggunakan kBudi menjadi ckGroupBudi, dan andi mengenkripsi kGroup menggunakan kAndi menjadi ckGroupAndi. Lalu simpan ckGroupBudi dan ckGroupAndi di server. Idealnya seperti ini, bagaimana proses pembagian kunci yang sebenarnya?

Budi memiliki data p1 yang di enkripsi menggunakan kGroup, lalu budi ingin membagikan data tersebut ke andi. Maka budi harus mengirim kGroup ke andi, tetapi kGroup tidak boleh dikirim secara langsung. Bagaimana metode pengirman kGroup ke andi?

Cara termudah adalah menggunakan public-private encryption. Budi memiliki publicKeyBudi dan privateKeyBudi, begitu juga andi memiliki publicKeyAndi dan privateKeyAndi.

Budi akan mendownload publicKeyAndi dari server, lalu mengenkripsi kGroup menggunakan publicKeyAndi menjadi ekGroupForAndi, lalu mengirim ekGroupForAndi ke andi (atau menyimpan ke server). Andi mendownload ekGroupForAndi, lalu mendekripsi menggunakan privateKeyAndi menjadi kGroup. Dengan begitu andi sudah mendapatkan kGroup untuk mendekripsi data p1. Setelah itu kGroup milik andi akan di CW menggunakan kAndi menjadi ckGroupAndi untuk disimpan di server.

Question: Bagiaman jika ingin menghapus andi dari group berbagi? (Revocation)

Maka budi bisa membuat kGroup2, lalu mendekripsi data p1 menggunakan kGroup menjadi plain, lalu mengenkripsi ulang menggunakan kGroup2. Setelah itu budi membagikan kGroup2 ke anggota group yang lain (tidak termasuk andi) dengan metode yang sama seperti diatas.

Algorithm Recommendation

  • Symmetric Encryption: AES-GCM dengan key size minimal 256 bits
  • Asymmetric Encryption: RSA-OAEP dengan key size minimal 2048 bits atau ECC
  • Key Derivation Function: PBKDF2, Argon2, atau scrypt
  • Hash Function: SHA-256 atau SHA-3
  • Random Number Generation: Web Crypto API atau libsodium
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment