Signature & Asymmetric Cryptography
Apa Itu Signature?
Bayangkan signature ini seperti stempel cap jempol digital yang membuktikan bahwa pesan yang dikirim benar-benar dari Anda dan belum diubah oleh orang lain di tengah jalan. Ini adalah mekanisme keamanan yang sangat penting dalam komunikasi antara sistem Anda dengan aplikasi seperti payment gateway.
Mengapa Signature Diperlukan?
Ketika Anda berkomunikasi dengan payment gateway melalui internet, ada risiko keamanan yang perlu dijaga. Misalnya, seseorang bisa saja mencoba:
Berpura-pura menjadi Anda dan mengirim request palsu
Mengubah data transaksi di tengah jalan (misalnya mengubah jumlah pembayaran dari Rp 100.000 menjadi Rp 10.000)
Mengirim notifikasi palsu ke server Anda seolah-olah pembayaran sudah berhasil padahal tidak
Signature mencegah semua hal ini dengan cara memastikan keaslian dan integritas data.
Bagaimana Signature Bekerja?
Signature dibuat dengan cara mencampur data transaksi dengan secret key (kunci rahasia) yang hanya diketahui oleh Anda dan payment gateway. Prosesnya menggunakan algoritma hashing (seperti SHA-256) yang menghasilkan string unik. Jika ada satu karakter saja yang berubah dari data aslinya, signature yang dihasilkan akan sama sekali berbeda.
Dari Sisi Client (Aplikasi Anda)
Ketika Anda mengirim request untuk membuat transaksi, Anda perlu generate signature. Berikut langkah demi langkah:
Langkah 1: Menyiapkan Data Anda mengumpulkan data-data penting seperti merchant ID, order ID, jumlah pembayaran, dan timestamp. Data ini disusun dalam format tertentu sesuai dokumentasi.
Langkah 2: Generate Signature Anda menggabungkan data tersebut dengan secret key Anda, lalu menggunakan algoritma SHA-256 untuk menghasilkan signature. Contohnya seperti ini: jika data Anda adalah "MERCHANT123|ORDER001|100000" dan secret key adalah "rahasia123", maka SHA-256 akan menghasilkan signature seperti "a3f5b8c9d2e1..." (string panjang yang unik).
Langkah 3: Mengirim Request Anda mengirim data transaksi beserta signature. Payment gateway akan memvalidasi signature ini untuk memastikan request benar-benar dari Anda.
Kegunaan dari sisi client: Signature membuktikan kepada payment gateway bahwa request ini legitimate dan berasal dari merchant yang sah (Anda). Tanpa signature yang valid, payment gateway akan menolak request Anda karena tidak bisa memverifikasi identitas Anda.
Dari Sisi Server Payment Gateway
Ketika menerima request dari Anda, mereka melakukan proses verifikasi:
Langkah 1: Menerima Data dan Signature menerima data transaksi Anda beserta signature yang Anda kirim.
Langkah 2: Generate Signature Sendiri mengambil data yang Anda kirim, menggabungkannya dengan secret key yang mereka simpan di database mereka (secret key yang sama dengan milik Anda), lalu generate signature menggunakan cara yang sama.
Langkah 3: Membandingkan membandingkan signature yang Anda kirim dengan signature yang baru mereka generate. Jika cocok, berarti data tidak berubah dan benar-benar dari Anda. Jika tidak cocok, request ditolak.
Kegunaan dari sisi server: Signature memungkinkan payment gateway untuk memverifikasi bahwa request benar-benar dari merchant yang sah dan data tidak dimanipulasi oleh pihak ketiga. Ini melindungi kedua belah pihak dari fraud.
Signature untuk Callback/Notification
Proses yang sama juga berlaku untuk arah sebaliknya. Ketika payment gateway ingin memberitahu Anda bahwa pembayaran sudah berhasil (callback), mereka akan:
Dari sisi payment gateway: Mereka generate signature berdasarkan data notifikasi (seperti order ID, status, jumlah) dan secret key, lalu mengirimkan data beserta signature ke server Anda.
Dari sisi aplikasi Anda: Server Anda menerima notifikasi, lalu melakukan verifikasi dengan cara yang sama: generate signature dari data yang diterima, lalu bandingkan dengan signature yang dikirim . Jika cocok, Anda bisa yakin bahwa notifikasi benar-benar dari paymen gateway dan bukan dari hacker yang mencoba menipu sistem Anda.
Analogi Sederhana
Bayangkan Anda dan teman Anda punya kode rahasia. Setiap kali Anda mengirim surat, Anda menulis pesan dan menambahkan hasil perhitungan matematis khusus berdasarkan isi surat dan kode rahasia tersebut. Teman Anda yang menerima surat akan melakukan perhitungan yang sama. Jika hasilnya cocok, dia tahu suApakah ada bagian tertentu yang ingin saya jelaskan lebih detail?
Perbedaan Asymmetric vs Symmetric Cryptography
Yang Anda lihat di kode tersebut menggunakan asymmetric cryptography (kriptografi asimetris) dengan pasangan kunci public-private key, bukan hanya menggunakan shared secret key biasa. Ini sebenarnya lebih aman daripada penjelasan sederhana saya sebelumnya.
Konsep Public Key dan Private Key
Dalam sistem asymmetric cryptography, ada dua kunci yang berbeda namun matematically related. Bayangkan seperti ini: private key adalah kunci untuk mengunci gembok, sedangkan public key adalah kunci untuk membuka gembok tersebut. Uniknya, kunci yang mengunci tidak bisa dipakai untuk membuka, begitu juga sebaliknya.
Private Key adalah kunci rahasia yang hanya Anda yang tahu. Ini seperti stempel cap pribadi Anda yang tidak boleh dilihat atau digunakan orang lain. Anda menyimpannya dengan sangat aman di server Anda.
Public Key adalah kunci yang boleh diketahui siapa saja. Ini seperti contoh cap jempol Anda yang dipajang di kantor polisi untuk verifikasi. Siapa pun bisa melihatnya dan menggunakannya untuk memverifikasi bahwa sesuatu benar-benar dari Anda.
Bagaimana Ini Bekerja di Payment Gateway?
Sekarang mari kita lihat alur lengkapnya dengan kedua kode yang Anda berikan.
Ketika Anda Mengirim Request
Pertama, ketika Anda ingin membuat transaksi, Anda menggunakan private key milik Anda sendiri untuk membuat signature. Mari saya breakdown prosesnya:
Langkah pertama, Anda menyiapkan data yang akan ditandatangani dengan menggabungkan HTTP method, path, body yang sudah di-minify (dikecilkan dan di-hash), dan timestamp menjadi satu string. Fungsi Minify di kode tersebut mengubah JSON body menjadi hash SHA-256, sehingga body yang panjang menjadi string pendek yang unik. Ini mirip seperti sidik jari dari data tersebut.
Langkah kedua adalah proses penandatanganan yang sebenarnya. Anda menggunakan private key Anda untuk "menandatangani" string tersebut dengan algoritma RSA-SHA256. Fungsi rsa.SignPKCS1v15 melakukan operasi matematis rumit yang menghasilkan signature unik. Signature ini hanya bisa dibuat oleh pihak yang memiliki private key Anda.
Setelah signature tergenerate, Anda mengirim request ke payment gateway dengan menyertakan data transaksi dan signature dalam header. Yang penting dipahami adalah signature ini dibuat dengan private key Anda, tapi nanti akan diverifikasi dengan public key Anda.
Bagaimana Payment Gateway Memverifikasi Request Anda?
Ketika payment gateway menerima request dari Anda, mereka tidak memerlukan private key Anda untuk verifikasi. Mereka menggunakan public key Anda yang sudah Anda berikan kepada mereka sebelumnya saat registrasi.
Proses verifikasinya seperti ini: Payment gateway mengambil data yang Anda kirim (method, path, body, timestamp) dan menyusunnya dengan cara yang sama. Kemudian mereka menggunakan public key Anda untuk memverifikasi signature. Fungsi rsa.VerifyPKCS1v15 akan melakukan operasi matematis untuk mengecek apakah signature tersebut benar-benar dibuat oleh private key yang berpasangan dengan public key tersebut.
Jika verifikasi berhasil, Payment gateway yakin bahwa request tersebut benar-benar dari Anda karena hanya pihak yang memiliki private key yang berpasangan dengan public key Anda yang bisa membuat signature yang valid. Ini juga membuktikan bahwa data tidak diubah di tengah jalan karena kalau ada perubahan sedikit saja, signature tidak akan valid.
Ketika Payment Gateway Mengirim Callback ke Anda
Sekarang arah sebaliknya, ketika Payment gateway ingin memberitahu Anda tentang status pembayaran. Prosesnya mirror dari yang tadi.
Payment gateway membuat signature menggunakan private key milik Payment gateway. Mereka menyusun data callback (method, path, body, timestamp) dan menandatanganinya dengan private key mereka. Kemudian mereka mengirim callback tersebut beserta signature dalam header X-Signature.
Di sisi Anda, ketika menerima callback, Anda menggunakan public key milik Payment gateway untuk memverifikasi signature.
Fungsi ValidateSignature melakukan hal yang sama seperti yang dilakukan Payment gateway saat memverifikasi request Anda, tapi kali ini menggunakan public key Payment gateway. Anda menyusun ulang string yang sama dari data callback yang diterima, lalu menggunakan fungsi rsa.VerifyPKCS1v15 untuk memverifikasi bahwa signature memang dibuat oleh Payment gateway.
Jika verifikasi berhasil, Anda bisa yakin bahwa callback tersebut benar-benar dari Payment gateway dan bukan dari hacker yang mencoba menipu sistem Anda dengan mengirim notifikasi palsu bahwa pembayaran sudah berhasil.
Mengapa Menggunakan Public-Private Key?
Anda mungkin bertanya, mengapa tidak pakai shared secret key saja seperti penjelasan saya sebelumnya? Ada beberapa alasan keamanan yang penting.
Dengan shared secret key, kedua pihak harus menyimpan kunci yang sama. Jika salah satu pihak kebobolan keamanannya, maka pihak lain juga terancam. Sedangkan dengan public-private key, private key tidak pernah dibagikan kemana-mana. Anda hanya perlu memberikan public key kepada Payment gateway, dan begitu juga sebaliknya.
Sistem ini juga memberikan non-repudiation, artinya Anda tidak bisa menyangkal bahwa Anda yang membuat transaksi tersebut karena hanya Anda yang punya private key. Ini penting untuk aspek legal dan audit.
Selain itu, dalam skenario dimana Anda berintegrasi dengan banyak payment gateway, setiap payment gateway hanya perlu tahu public key Anda, bukan rahasia internal Anda. Ini memudahkan manajemen keamanan.
Ringkasan Alur Lengkap
Mari saya rangkum dengan gambar yang lebih jelas. Anda punya sepasang kunci: private key Anda yang rahasia dan public key Anda yang diberikan ke Payment gateway. Payment gateway juga punya sepasang kunci: private key Payment gateway yang rahasia dan public key Payment gateway yang diberikan ke Anda.
Ketika Anda kirim request ke Payment gateway, Anda sign dengan private key Anda, lalu Payment gateway verify dengan public key Anda. Ketika Payment gateway kirim callback ke Anda, mereka sign dengan private key Payment gateway, lalu Anda verify dengan public key Payment gateway.
Private key tidak pernah dibagikan atau dikirim kemana-mana. Private key hanya digunakan untuk membuat signature di sistem masing-masing. Sedangkan public key dibagikan kepada pihak lain untuk keperluan verifikasi.
Ini adalah sistem keamanan yang sangat robust dan merupakan standar industri untuk komunikasi antara sistem yang berbeda, terutama dalam hal yang sensitif seperti transaksi keuangan.
Praktik Kode
Last updated