DEBI PRAHARADIKA
← Back to Blog Index
Security2026-06-0613 min read

Membangun Sistem E-Logger SIM Diklat dengan Brankas File Berbasis Algoritma AES

Panduan arsitektur keamanan dan implementasi sistem pencatatan aktivitas (E-Logger) serta brankas berkas pelatihan (SIM Diklat) terenkripsi menggunakan algoritma AES-GCM 256-bit, MySQL, dan Golang.

Dalam Sistem Informasi Manajemen Pendidikan dan Pelatihan (SIM Diklat) instansi pemerintah maupun korporasi skala besar, data log aktivitas pelatihan serta dokumen evaluasi (seperti nilai kelulusan, lembar ujian, dan sertifikat pelatihan) merupakan informasi yang sangat sensitif. Kebocoran atau manipulasi pada data ini dapat merusak kredibilitas program pelatihan.

Untuk menjaga integritas dan kerahasiaan (confidentiality) log aktivitas serta file penting tersebut, sistem memerlukan mekanisme E-Logger terenkripsi dan Brankas File (secure file vault) yang aman dari akses ilegal, bahkan oleh administrator database (database administrator) sekalipun.

Mekanisme pertahanan terbaik untuk kebutuhan ini adalah menggunakan standar kriptografi simetris Advanced Encryption Standard (AES) dengan enkripsi terotentikasi.

Artikel ini akan membahas arsitektur keamanan sistem, model matematika enkripsi AES, skema database MySQL, implementasi modul enkripsi di Golang, serta perancangan antarmuka menggunakan TailwindCSS.


1. Arsitektur E-Logger SIM Diklat & Brankas File

Sistem ini didesain agar setiap data log aktivitas yang ditulis ke dalam database MySQL dan setiap file pelatihan yang diunggah ke media penyimpanan fisik langsung berada dalam bentuk terenkripsi.

Berikut adalah blueprint arsitektur E-Logger SIM Diklat dan Brankas File berbasis AES:

Blueprint Arsitektur E-Logger AES

Alur Kerja Ingestion Pipeline & Retrieval:

  1. Data Intake: Log aktivitas pelatihan (seperti riwayat ujian peserta) dan berkas mentah (plaintext) dikirimkan ke backend melalui layanan Golang.
  2. Encryption Engine:
    • Golang memproses data menggunakan algoritma AES-256 GCM.
    • Sistem menghasilkan kunci enkripsi unik (symmetric key) yang diturunkan dari kunci master menggunakan fungsi penurunan kunci (key derivation function).
    • Menambahkan Initialization Vector (IV) atau nonce unik pada setiap transaksi enkripsi untuk menghindari pola ciphertext yang berulang.
  3. Storage:
    • Berkas dokumen terenkripsi disimpan ke dalam folder penyimpanan fisik (external file storage).
    • Metadata dokumen dan teks log terenkripsi disimpan langsung ke tabel database MySQL.
  4. Access & Decryption: Pengguna resmi yang memiliki hak akses mengirimkan kunci/password dekripsi untuk membuka kembali berkas menjadi plaintext pada antarmuka pengguna web.

2. Memahami Variabel Kriptografi AES-GCM

Untuk menjamin keamanan maksimal, kita menggunakan mode operasi Galois/Counter Mode (GCM) pada AES (AES-GCM). Tidak seperti mode klasik seperti Cipher Block Chaining (CBC) yang membutuhkan proses padding manual dan rentan terhadap serangan manipulasi teks, AES-GCM menawarkan enkripsi terotentikasi secara bawaan (authenticated encryption).

Berikut adalah bagan alur logis sistem enkripsi AES pada log dan file pelatihan:

Sistem Berpikir Enkripsi AES

Istilah dan Kata Kunci:

  • Plaintext: Data asli (berupa dokumen PDF pelatihan atau teks log JSON) yang belum disandikan.
  • Ciphertext: Output dari hasil enkripsi AES yang berupa biner acak yang tidak dapat dibaca tanpa kunci dekripsi yang valid.
  • Symmetric Key: Kunci tunggal yang digunakan baik untuk proses enkripsi maupun dekripsi. Untuk tingkat keamanan yang aman, kita menggunakan panjang kunci 256-bit.
  • Initialization Vector (IV) / Nonce: Angka acak unik berukuran 96-bit (12 byte) untuk mode GCM. Variabel ini memastikan bahwa dua file plaintext yang identik akan menghasilkan ciphertext yang berbeda saat dienkripsi berulang kali.
  • Authentication Tag (Auth Tag): Tanda tangan digital mini (biasanya 128-bit) yang dihasilkan secara otomatis oleh mode GCM. Variabel ini berfungsi untuk memvalidasi integritas data, menjamin ciphertext tidak dimodifikasi di tengah jalan (anti-tampering).
  • Salt: Nilai acak yang digabungkan dengan password master saat melakukan generate kunci menggunakan algoritma seperti PBKDF2 atau scrypt untuk mencegah serangan rainbow table.

3. Skema Database MySQL untuk E-Logger & Metadata Berkas

MySQL bertindak sebagai penyimpan metadata log aktivitas pelatihan dan pointer link berkas terenkripsi. Kita menggunakan tipe data BLOB atau VARBINARY untuk menyimpan data terenkripsi mentah secara aman:

-- Menyimpan riwayat aktivitas diklat terenkripsi (E-Logger)
CREATE TABLE diklat_activity_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    action_type VARCHAR(100) NOT NULL, -- misal: 'EXAM_SUBMISSION'
    encrypted_payload BLOB NOT NULL,   -- Ciphertext dari detail log JSON
    encryption_iv VARBINARY(16) NOT NULL, -- IV unik untuk baris ini
    auth_tag VARBINARY(16) NOT NULL,     -- Tag otentikasi GCM
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Menyimpan metadata brankas berkas (Secure File Vault)
CREATE TABLE file_vault (
    id INT AUTO_INCREMENT PRIMARY KEY,
    file_name VARCHAR(255) NOT NULL,
    storage_path VARCHAR(555) NOT NULL,
    file_size BIGINT NOT NULL,
    uploaded_by INT NOT NULL,
    encrypted_file_key VARBINARY(256) NOT NULL, -- Kunci AES file yang dibungkus dengan kunci master
    file_iv VARBINARY(16) NOT NULL,            -- IV khusus untuk file ini
    file_tag VARBINARY(16) NOT NULL,           -- Tag otentikasi berkas
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

4. Implementasi Enkripsi & Dekripsi AES-GCM (Golang)

Bahasa pemrograman Golang memiliki performa tinggi dalam pengolahan biner kriptografi. Berikut adalah modul lengkap enkripsi dan dekripsi berkas berbasis AES-GCM:

package main

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"errors"
	"io"
)

// AESGCMEncryptor menangani operasi kriptografi menggunakan mode AES-GCM 256-bit.
type AESGCMEncryptor struct {
	key []byte // Kunci simetris 32 byte (256-bit)
}

// NewAESGCMEncryptor membuat instansi baru dengan kunci pengaman 32 byte.
func NewAESGCMEncryptor(key []byte) (*AESGCMEncryptor, error) {
	if len(key) != 32 {
		return nil, errors.New("kunci enkripsi harus berukuran tepat 32 byte untuk standar AES-256")
	}
	return &AESGCMEncryptor{key: key}, nil
}

// Encrypt menyandikan plaintext menjadi ciphertext terotentikasi.
// Output yang dihasilkan adalah kombinasi: IV + Ciphertext (dengan Auth Tag di bagian akhir).
func (e *AESGCMEncryptor) Encrypt(plaintext []byte) ([]byte, error) {
	// Buat block cipher AES menggunakan kunci
	block, err := aes.NewCipher(e.key)
	if err != nil {
		return nil, err
	}

	// Bungkus block cipher dalam mode Galois/Counter Mode (GCM)
	gcm, err := cipher.NewGCM(block)
	if err != nil {
		return nil, err
	}

	// Buat Initialization Vector (IV) / Nonce acak berukuran 12 byte (standar GCM)
	nonce := make([]byte, gcm.NonceSize())
	if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
		return nil, err
	}

	// Lakukan proses enkripsi. Fungsi Seal akan menempelkan ciphertext dan tag autentikasi
	// di belakang slice nonce yang kita kirimkan sebagai prefix pertama.
	ciphertext := gcm.Seal(nonce, nonce, plaintext, nil)
	return ciphertext, nil
}

// Decrypt memecahkan ciphertext kembali menjadi plaintext asli.
// Modul ini memotong IV pada bagian awal dan melakukan verifikasi integritas data secara otomatis.
func (e *AESGCMEncryptor) Decrypt(encryptedData []byte) ([]byte, error) {
	block, err := aes.NewCipher(e.key)
	if err != nil {
		return nil, err
	}

	gcm, err := cipher.NewGCM(block)
	if err != nil {
		return nil, err
	}

	nonceSize := gcm.NonceSize()
	if len(encryptedData) < nonceSize {
		return nil, errors.New("ukuran data terenkripsi terlalu kecil (corrupted ciphertext)")
	}

	// Pisahkan IV (nonce) dan ciphertext asli
	nonce, ciphertext := encryptedData[:nonceSize], encryptedData[nonceSize:]

	// Buka kembali ciphertext. Jika data dimodifikasi atau kunci salah, fungsi Open akan mengembalikan error.
	plaintext, err := gcm.Open(nil, nonce, ciphertext, nil)
	if err != nil {
		return nil, errors.New("dekripsi gagal: kunci tidak valid atau integritas data telah rusak (tampered)")
	}

	return plaintext, nil
}

5. Flow Logika Algoritma & Antarmuka Brankas File (TailwindCSS)

Saat pengguna ingin membuka berkas rahasia di dalam aplikasi SIM Diklat, sistem akan memvalidasi kunci keamanan melalui alur algoritma berikut sebelum menyajikan berkas ke browser:

Workflow Proses AES-GCM

Untuk mengelola brankas berkas dan pencatatan log dengan antarmuka yang user friendly, kita dapat menggunakan rancangan dashboard TailwindCSS berikut:

Desain Antarmuka Brankas File SIM Diklat

Struktur layout visual statis dashboard menggunakan utilitas TailwindCSS:

<div class="min-h-screen bg-neutral-950 text-neutral-100 flex font-sans">
  
  <!-- Sidebar Navigation -->
  <aside class="w-64 bg-neutral-900 border-r border-neutral-800 p-6 flex flex-col justify-between">
    <div class="space-y-6">
      <div class="flex items-center space-x-2">
        <span class="text-emerald-400 text-2xl">🔒</span>
        <span class="font-bold text-lg text-white">E-Logger SIM</span>
      </div>
      <nav class="space-y-1">
        <a href="#" class="block px-4 py-2 bg-emerald-500/10 text-emerald-400 rounded-lg font-semibold text-sm">Dashboard</a>
        <a href="#" class="block px-4 py-2 text-neutral-400 hover:text-white rounded-lg text-sm">Secure File Vault</a>
        <a href="#" class="block px-4 py-2 text-neutral-400 hover:text-white rounded-lg text-sm">Activity Logger</a>
      </nav>
    </div>
    <div class="text-xs text-neutral-500">Security System v1.0.0</div>
  </aside>

  <!-- Main Content -->
  <main class="flex-1 p-8 space-y-8 overflow-y-auto">
    <!-- Header -->
    <header class="flex justify-between items-center">
      <div>
        <h2 class="text-xl font-bold text-white">Secure File Vault</h2>
        <p class="text-xs text-neutral-400">Penyimpanan berkas diklat terenkripsi end-to-end</p>
      </div>
      <button class="bg-emerald-600 hover:bg-emerald-500 text-neutral-950 font-bold px-4 py-2 rounded-lg text-xs transition">
        + Upload File Baru
      </button>
    </header>

    <!-- File List Table -->
    <section class="bg-neutral-900 border border-neutral-800 rounded-lg overflow-hidden">
      <table class="w-full text-left border-collapse text-xs">
        <thead>
          <tr class="bg-neutral-950 text-neutral-400 uppercase tracking-wider border-b border-neutral-800">
            <th class="p-4">File Name</th>
            <th class="p-4">Uploaded By</th>
            <th class="p-4">Date</th>
            <th class="p-4">Size</th>
            <th class="p-4 text-right">Status</th>
          </tr>
        </thead>
        <tbody class="divide-y divide-neutral-800 text-neutral-300">
          <tr>
            <td class="p-4 flex items-center space-x-2">
              <span class="text-emerald-500">🔒</span>
              <span class="font-semibold text-white">Trainer_Guide_V1.pdf</span>
            </td>
            <td class="p-4">User "jdoe"</td>
            <td class="p-4">25/05/2023 3:57 PM</td>
            <td class="p-4">2.37 KB</td>
            <td class="p-4 text-right">
              <span class="bg-emerald-950 text-emerald-400 border border-emerald-800 px-2 py-0.5 rounded-full font-bold">Encrypted</span>
            </td>
          </tr>
        </tbody>
      </table>
    </section>
  </main>
</div>

6. Mengapa Harus AES-GCM 256-bit?

Implementasi AES-GCM di atas memberikan kelebihan utama yang tidak dimiliki oleh skema enkripsi dasar:

  1. Kerahasiaan Tingkat Tinggi (Confidentiality): Menggunakan kunci simetris 256-bit yang saat ini tidak dapat dipecahkan dengan teknik brute force komputer modern.
  2. Perlindungan Integritas Data (Integrity Verification): Tag otentikasi GCM mematikan kemungkinan pelaku kejahatan siber menyisipkan kode berbahaya ke dalam file terenkripsi. Jika ada 1 bit saja yang berubah, proses dekripsi akan langsung gagal.
  3. Audit Trail yang Valid: E-Logger mencatat setiap aktivitas secara akurat ke MySQL. Karena payload disimpan secara terenkripsi, isi dari log aktivitas tersebut aman dari manipulasi pihak ketiga.

Referensi & Resource Penting

  • Dworkin, M. (2007). Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC. NIST Special Publication 800-38D. Standar formal spesifikasi AES-GCM.
  • Golang crypto/aes package. Dokumentasi paket pustaka standar untuk enkripsi AES di Go: Go aes package documentation.
  • MySQL Encryption Functions. Penjelasan fungsi bawaan enkripsi basis data MySQL: MySQL Encryption Docs.
  • Daemen, J., & Rijmen, V. (2002). The Design of Rijndael: AES - The Advanced Encryption Standard. Springer-Verlag. Buku akademis utama yang ditulis oleh penemu algoritma AES sendiri.