Saat ingin menghandle informasi rahasia kita perlu mengamankan informasi tersebut agar hanya pihak terkait saja yang dapat membaca isi informasi tersebut. Misalnya saat bertukar pesan lewat perantara, tentu kita tidak ingin seseorang bisa mencuri informasi tersebut dan kita juga ga ingin informasi tersebut bocor lewat perantara. Untuk itu kita perlu mengamankan data tersebut. Dalam Cryptography setidaknya ada 2 cara untuk mengamankan data agar tidak bisa diketahui oleh pihak ketiga, yaitu Asymmetric & Symmetric Cryptography.
Symmetric Cryptography
Symmetric Cryptography adalah proses mengamankan data dengan mengunci pesan menjadi bentuk yang tidak terbaca (encryption) dan dapat dikembalikan lagi ke bentuk asalnya (decryption). Ini menggunakan teknik Two-way Function dalam matematika karena hasilnya dapat di-reverse. Jadi, setiap pesan yang dienkripsi pasti bisa di-reverse hasilnya melalui proses dekripsi. Ibarat perhitungan matematika, kita dapat mengembalikan hasil perkalian menggunakan pembagian. Seperti 2 * 3 = x, perhitungannya bisa di-reverse menjadi x / 3 = 2. Jika “2” adalah isi pesan, “3” adalah key algoritmanya, maka “x” adalah hasil enkripsi. Untuk dekripsi, maka tinggal dibolak-balik dengan pembagian. Contoh kasus yang cocok menggunakan cara ini adalah saat menyimpan data sensitif seperti NIK, foto KTP, dokumen penting, nomor rekening, dan data-data sensitif lainnya.
Contoh sederhananya adalah menggunakan algoritma Caesar Cipher. Misalnya dengan mengganti huruf pada pesan dengan format A=1, B=2, C=3, dan seterusnya. Jadi misalkan ada orang mengirim pesan “BACA”, maka pesan yang dikirimkan nantinya adalah “2131”. Proses ini disebut enkripsi. Si penerima juga harus ngerti algoritmanya untuk mengartikan pesannya, yaitu mengganti kembali angka menjadi huruf. Proses tersebut dinamakan dekripsi. Selama algoritmanya ga bocor, orang lain atau si perantara ga akan tahu arti dari pesan “2131” tadi. Agar lebih aman lagi, kita bisa menambahkan algoritma lagi, setiap huruf yang dijadikan angka akan dikali 20. Sehingga pesannya jadi “40206020”. Angka “20” tersebut adalah “key” yang harus sama-sama diketahui oleh pengirim dan penerima yang ga boleh bocor. Dengan begini orang lain akan lebih sulit menebak pesan tersebut. Tapi tentu saja itu tidak cukup aman. Ini hanyalah contoh termudah agar memahami cara kerja enkripsi/dekripsi. Contoh implementasinya yang sering digunakan di dunia nyata adalah AES (Advanced Encryption Standard), DES (Data Encryption Standard), Blowfish, dan beberapa lainnya dengan algoritma yang aman dan teruji. Tapi saat ini yang dianggap paling aman adalah AES dan diadopsi oleh beberapa library dan service keamanan karena cukup kuat dan cepat. Cara yang cukup ngehits adalah menggunakan service sendiri untuk melakukan encrypt dan decrypt seperti menggunakan Vault. Jadi tiap encrypt/decrypt kita akan call ke service Vault. Jadi, pada database kita hanya menyimpan hasil enkripsinya saja, dan developer yang ga punya akses ke Vault ga akan tahu isi data tersebut. Jadi nanti meskipun database kita bocor oleh hacker, mereka ga akan tau isi data sensitif user.
Asymmetric Cryptography
Asymmetric Cryptography adalah proses mengamankan data dengan mengubah data menjadi karakter tertentu (hashing) dan tidak dapat dikembalikan lagi ke bentuk asalnya (un-hashed). Ini menggunakan teknik One-way Function dalam matematika. Jadi, setiap pesan yang dienkripsi ga akan bisa didekripsi. Satu-satunya cara untuk membuktikan datanya benar adalah dengan melakukan hashing sebuah data lalu bandingkan dengan hasil hashing sebelumnya, jika sama maka datanya valid. Makanya Asymmetric Cryptography ini keamanannya lebih kuat dibanding Symmetric Encryption. Ibarat perhitungan matematika, kita dapat mengubah suatu angka menjadi bilangan lain tanpa bisa diubah lagi ke bentuk asalnya menggunakan modulo. Seperti 7 % 5 = x, perhitungannya ga bisa di-reverse. Jika “7” adalah input isi pesan, “% 5” adalah algoritmanya, maka “x” adalah hasil hashing. Hasilnya adalah x = 2. Kita ga bisa mengembalikan angka “2” ini kembali menjadi “7” dengan rumus apapun. Untuk melakukan validasi, kita harus melakukan hashing terhadap input menggunakan perhitungan yang sama. Misalnya menggunakan input angka 8, jadi 8 % 5 = 3. Maka 8 bukanlah isi pesan yang valid. Tapi jika misalkan user menginput angka 7, jadi 7 % 5 = 2, maka 7 adalah hasil yang valid. Lalu misalkan kita menginput angka 12, jadi 12 % 5 =2, hasilnya juga valid karena hasilnya juga sama seperti 7 % 5 = 2. Pada konsep hashing ini disebut collision. Salah satu kelemahan dari Asymmetric Encryption adalah ada kemungkinan terjadi collision. Contoh kasus yang cocok menggunakan cara ini adalah saat menyimpan data untuk authentikasi seperti menyimpan password, validasi certificate (SSL), digital signature, dan autentikasi lainnya. Beberapa contoh implementasi Asymmetric Cryptography adalah MD5, SHA-256, SHA-512, Blake2, BCrypt, Argon2, End to End Encryption, dan beberapa lainnya.
Yang paling populer saat ini adalah SHA-256 karena cukup aman dan cepat. Hasil hashing dari SHA-256 adalah karakter berukuran 256 bit. Jadi karakter yang diinput akan dikalkulasi sedemikian rupa hingga menjadi 256 bit. Ini didesain cukup aman dari collision. Untuk versi yang lebih aman lagi ada SHA-512, namun outputnya cukup panjang karena menghasilkan output 512 bit. Performanya juga lebih lambat dibanding SHA-256, makanya ini jarang dipake meskipun lebih aman. Permasalahan dari hashing seperti ini adalah hasilnya selalu sama. Misalkan inputnya adalah “abc” dan hash outputnya adalah “xyz” maka setiap kali hash, maka outputnya selalu sama. Ini rentan terhadap Rainbow Table Attack karena pasangan input dan output hash jadi bisa ditebak. Misalkan ada data lain yang hasil hash-nya juga “xyz”, maka kita bisa input datanya dengan “abc” dan validasinya bisa terlewati.
Untuk mecegahnya kita bisa menambahkan Salt, yaitu karakter random yang akan ditambahkan pada input agar jika ada input yang sama maka outputnya akan beda. Input yang akan di-hash nanti adalah input + salt. Misalkan inputnya “abc”, lalu kita akan generate salt dari input tersebut, misalnya “Ac12b”. Nanti input yang akan dikalkulasi hash-nya menjadi “abcAc12b” sehingga output hash-nya misalnya menjadi “def”. Jika ada input lagi dengan value yang sama, maka akan di-generate lagi salt yang berbeda, misalkan saltnya adalah “bC321”. Input yang akan dikalkulasi menjadi “abcbC321” dengan output hash misalnya “ghi”. Dengan begini hasil output dari hash akan lebih unik meskipun karakter yang kita masukkan sama. Untuk validasinya juga sama, input + salt akan dikalkulasi hashing-nya, lalu akan dibandingkan hasil hash tersebut dengan hash yang disimpan. Untuk itu salt ini harus kita simpan dan jangan sampai hilang. Jika hilang tentu saja kita akan kehilangan data. Pada penyimpanan password, salt ini bisa disimpan di tabel yang sama dengan tabel penyimpanan password biar gampang melakukan autentikasi.
Agar lebih aman lagi, kita bisa melakukan hashing berkali-kali beberapa ronde. Jadi, input + salt di-hash, lalu hasilnya di-hash lagi berkali-kali sehingga hasilnya lebih unik lagi. Inilah yang dilakukan oleh BCrypt di mana cost factor dan salt juga disimpan di dalam hasil hash. Misalnya kita generate hash untuk value “admin” dengan cost factor = 12, dan salt “cB2d”, maka input yang akan di-hash adalah “admincB2d” terus-terusan sebanyak 2^12 kali. Berarti sekitar 4096 kali. Hasilnya tentu lebih unik lagi. Cost factor, salt, dan hash input akan disimpan di dalam outputnya sehingga kita ga butuh simpan salt dan cost factor di tempat terpisah seperti di database. Semakin tinggi cost factor tentu semakin lambat kalkulasinya. Best practice value dari cost factor saat ini adalah antara 10-12 agar cukup aman dan ga terlalu lambat. Bila dibandingkan dengan SHA-256 secara performa BCrypt lebih lambat. Tapi itu justru jadi kelebihan tersendiri buat BCrypt karena lambat itulah yang membuat proses hacking via Brute-Force jadi lebih sulit. Makanya BCrypt ini sering digunakan untuk melakukan hashing password pada sistem jaman sekarang. Alternatif dari BCrypt adalah Argon2 dengan fitur yang mirip. Tapi Argon2 masih belum sepopuler BCrypt dan penggunaannya masih jarang terdengar meskipun Argon2 pernah dinobatkan sebagai pemenang algoritma hashing password terbaik.
Asymmetric Cryptography juga digunakan pada End to End Encryption karena key untuk melakukan enkripsi dan dekripsi berbeda sehingga masih tergolong one way function. Ini digunakan pada aplikasi pertukaran pesan seperti WhatsApp agar pesan yang dikirim hanya bisa dibaca oleh akun pengirim dan penerima saja tanpa bisa dilihat oleh orang lain termasuk software engineer WhatsApp. Jadi, masing-masing pengirim dan penerima pesan memiliki sepasang public key dan private key. Public key adalah key yang bisa dilihat oleh publik yang digunakan untuk mengenkripsi pesan. Pada WhatsApp key ini disimpan di perangkat smartphone, makanya saat ganti hp kita harus mengaktifkan WhatsApp dari hp lama untuk sinkronisasi ke hp baru. Misalkan Aldi ingin mengirimkan pesan ke Budi, maka Aldi akan mengenkripsi pesan tersebut menggunakan public key milik Budi. Pesan tersebut ga akan bisa didekripsi kecuali menggunakan private key milik Budi yang hanya dimiliki oleh Budi. Termasuk si pengirim ketika pesannya sudah dienkripsi maka dia sendiri ga akan bisa melakukan dekripsi. Cara kerjanya mirip dengan operasi matematika menggunakan bilangan prima yang bisa menghasilkan pasangan bilangan unik yang dikalkulasi dengan aritmatika modulo. RSA adalah salah satu algoritma dari End to End Encryption yang menggunakan kalkulasi bilangan prima yang besar dan modulo inverse saat melakukan enkripsi & dekripsi dengan tambahan algoritma yang aman tentunya.
Verdict
Itulah perbedaan Symmetric dan Asymmetric Cryptography. Keduanya digunakan pada kasus-kasus yang berbeda. Symmetric lebih sering digunakan untuk proteksi data sensitif dan dokumen penting. Sedangkan Asymmetric lebih sering digunakan untuk kebutuhan autentikasi seperti pada password, digital signature, atau pertukaran pesan pribadi menggunakan End to End Encryption.