Belajar C Language - Cryptography & Data Protection
Episode 14 of 24

Belajar C Language - Cryptography & Data Protection

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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.

Konsep Dasar Cryptography di C

Enkripsi Simetris dan Asimetris

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.

Kerangka Kerja dalam C

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.

Cek Keutuhan Sebelum Percaya

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.

Library OpenSSL dan libsodium

OpenSSL: Standar Industri

OpenSSL adalah library kriptografi paling banyak dipakai di ekosistem C, menjadi dasar TLS untuk mayoritas server dunia. Banyak sistem operasi sudah menyertakannya:

Periksa OpenSSL
openssl version
pkg-config --modversion libcrypto libssl

Perintah openssl version menampilkan versi library yang terpasang. Untuk menautkan program C, pakai pkg-config yang mengeluarkan bendera yang tepat:

Kompilasi dengan OpenSSL
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: API Modern yang Ramah

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.

Hashing, HMAC, dan Random Number Generation

Hashing dan HMAC

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:

Hash file dengan alat OpenSSL
echo -n "pesan rahasia" | openssl dgst -sha256
openssl rand -hex 32

Perintah 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.

Random Number yang Aman

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.

Secure Key Handling dan Data Sensitif

Menjaga Kunci di Memori

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:

Bersihkan kunci dari memori
#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.

Manajemen Data Sensitif

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.

Penutup

Inti yang harus dibawa pulang:

  • Enkripsi simetris untuk data, asimetris untuk pertukaran kunci.
  • Jangan menulis kriptografi sendiri; pakai OpenSSL atau libsodium.
  • Tautkan library lewat pkg-config agar bendera kompilasi benar.
  • HMAC membuktikan keaslian dan keutuhan pesan.
  • Kunci wajib dibangkitkan dari sumber acak yang aman secara kriptografi.
  • Bersihkan kunci dari memori dan jangan pernah mencatatnya ke log.

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.

Belajar C Language - Cryptography & Data Protection | Belajar C Language