Episode ini membuka kriptografi untuk aplikasi C: konsep dasar enkripsi simetris dan asimetris, library OpenSSL dan libsodium, hashing, HMAC, dan random number generation yang aman, serta secure key handling dan manajemen data sensitif di memori.

Data yang melintas jaringan tanpa proteksi bisa dibaca siapa saja. Episode 14 membahas kriptografi dalam aplikasi C: bagaimana melindungi data dengan enkripsi, memastikan keutuhan dengan hashing dan HMAC, serta membangkitkan bilangan acak yang aman secara kriptografi.
Aturan penting yang harus dipahami sejak awal: jangan pernah menulis kriptografi sendiri. Selalu gunakan library yang sudah diuji oleh komunitas keamanan dunia, seperti OpenSSL dan libsodium. Kriptografi yang ditulis sendiri hampir pasti mengandung kelemahan fatal.
Episode ini fokus pada pemakaian library yang benar: algoritma yang tepat, konfigurasi yang aman, dan kebiasaan menjaga kunci serta data sensitif di memori.
Enkripsi simetris memakai satu kunci untuk mengenkripsi dan mendekripsi, cepat dan cocok untuk data besar. Contoh modern: AES-256-GCM. Enkripsi asimetris memakai pasangan kunci publik dan privat, dipakai untuk pertukaran kunci dan tanda tangan. Di praktik nyata, keduanya digabung: kunci simetris acak dibungkus oleh kriptografi asimetris.
Program C berkomunikasi dengan library kriptografi lewat API yang menyediakan objek konteks, fungsi inisialisasi, dan fungsi proses. Sebagian besar kesalahan pemakaian bukan pada matematika algoritma, tetapi pada manajemen kunci, padding, dan pembersihan memori. Kualitas implementasi kriptografi ditentukan oleh detail ini.
Kriptografi memberi dua jaminan berbeda yang sering tertukar: kerahasiaan memastikan hanya pemegang kunci yang bisa membaca, sedangkan keutuhan memastikan data tidak diubah. Enkripsi tanpa authentication seperti AES-CBC hanya menjamin kerahasiaan; penyerang tetap bisa mengutak-atik ciphertext. Karena itu mode AES-GCM menggabungkan enkripsi dan authentication dalam satu operasi. Pahami jaminan mana yang kalian butuhkan sebelum memilih algoritma.
OpenSSL adalah library kriptografi paling banyak dipakai di ekosistem C, menjadi dasar TLS untuk mayoritas server dunia. Banyak sistem operasi sudah menyertakannya:
openssl version
pkg-config --modversion libcrypto libsslPerintah openssl version menampilkan versi library yang terpasang. Untuk menautkan program C, pakai pkg-config yang mengeluarkan bendera yang tepat:
gcc -Wall $(pkg-config --cflags openssl) app.c -o app $(pkg-config --libs openssl)Pola $(pkg-config --cflags openssl) menyisipkan jalur header, dan bagian libs menautkan libcrypto dan libssl. Pastikan selalu memakai versi OpenSSL yang didukung — versi usang rentan terhadap CVE.
libsodium adalah wrapper modern atas algoritma yang direkomendasikan, dengan API yang jauh lebih sulit dipakai salah. Pengembangannya berfokus pada kegunaan: operasi default sudah memakai pengaturan aman, dan panjang kunci selalu eksplisit. Untuk project baru yang mengutamakan kesederhanaan, libsodium adalah pilihan yang sangat kuat.
Hash satu arah seperti SHA-256 menghasilkan sidik jari data dengan panjang tetap. Hash cocok untuk cek keutuhan dan penyimpanan kata sandi, tetapi untuk kata sandi gunakan fungsi khusus seperti Argon2 yang lambat secara sengaja. HMAC memakai hash dengan kunci rahasia, menghasilkan tanda tangan yang membuktikan keaslian dan keutuhan pesan:
echo -n "pesan rahasia" | openssl dgst -sha256
openssl rand -hex 32Perintah openssl dgst -sha256 menghitung hash SHA-256 dari input. openssl rand -hex 32 membangkitkan 32 byte acak aman yang bisa dijadikan kunci. Inilah perbedaan utama: pembangkit acak biasa untuk statistik, pembangkit acak kriptografi untuk kunci — jangan tertukar.
Pembangkit acak standar rand tidak aman untuk kriptografi. Gunakan getrandom di Linux atau fungsi randombytes di libsodium. Kunci harus dibangkitkan dari sumber entropi kernel, bukan dari waktu sistem atau seed yang bisa ditebak.
Kunci di memori bisa bocor lewat core dump, swap, atau snapshot proses. Beberapa praktik yang disarankan: simpan kunci dalam memset setelah dipakai, mencegah compiler mengoptimasi pembersihan dengan volatile, dan menahan memori dari swap dengan mlock:
#include <string.h>
#include <sys/mman.h>
void bersihkan(unsigned char *kunci, size_t n) {
mlock(kunci, n);
volatile unsigned char *p = kunci;
while (n--) {
*p++ = 0;
}
munlock(kunci, n);
}mlock(kunci, n) mencegah halaman memori kunci dipindahkan ke swap, dan pengisian lewat pointer volatile memastikan nol benar-benar ditulis tanpa dioptimasi compiler. Baca kunci dari env atau vault, bukan dari argumen yang terlihat di daftar proses.
Data sensitif seperti kata sandi dan token harus dibersihkan segera setelah tidak dipakai, tidak pernah dicetak ke log, dan tidak pernah dikirim sebagai plaintext tanpa TLS. Batasi juga siapa yang bisa membaca file kunci dengan izin berkas yang ketat. Keamanan data adalah rantai; satu mata rantai yang lemah melemahkan semuanya.
Warning
Menggulir kriptografi sendiri hampir pasti menghasilkan sistem yang tidak aman. Gunakan library yang teruji, ikuti pembaruan keamanannya, dan jalankan alat seperti sodium_init serta audit dependency secara berkala.
Inti yang harus dibawa pulang:
Di episode 15 selanjutnya kita akan membahas performance optimization — profiling dengan perf, gprof, dan Valgrind, optimasi dengan loop unrolling, inline, dan compiler flags, memory locality dan cache friendliness, hingga tradeoff antara readability dan performance.