Didiek
Posted on
Projects & Solutions

Keamanan: Enkripsi Data pada Database Janjio

Author

Sejak awal membuat Janjio, saya sudah memikirkan satu hal yang menurut saya cukup penting: data apa saja yang nantinya akan saya simpan, dan bagaimana cara menjaganya?

Janjio akan berhubungan dengan data pribadi pengguna. Nama, nomor telepon, alamat, tanggal lahir, sampai informasi yang berkaitan dengan identitas.

Data seperti ini tentu bukan sesuatu yang ingin saya simpan begitu saja tanpa perlindungan tambahan.

Saya membayangkan satu kondisi sederhana: bagaimana jika suatu hari seseorang berhasil mendapatkan akses ke database Janjio?

Saya tentu tidak bisa menjamin hal seperti itu tidak akan pernah terjadi. Yang bisa saya lakukan adalah mempersiapkan aplikasi sebaik mungkin, termasuk memastikan bahwa data sensitif tidak langsung terbaca ketika database diakses oleh pihak yang tidak seharusnya.

Karena itu, sejak awal saya memilih untuk menerapkan enkripsi pada data-data tertentu di database Janjio.

Janjio sendiri dibangun menggunakan Laravel, yang sudah menyediakan fitur enkripsi melalui library bawaan. Saya kemudian memanfaatkannya menggunakan Model Casting, sehingga data tertentu dapat dienkripsi sebelum disimpan dan otomatis didekripsi ketika digunakan kembali.

Dengan begitu, saya tidak perlu melakukan proses enkripsi dan dekripsi secara manual di setiap bagian aplikasi.

Sederhana, tetapi menjadi salah satu lapisan keamanan yang menurut saya penting untuk diterapkan sejak awal.

Berikut adalah contoh implementasi yang saya gunakan pada Janjio.

Mengenkripsi Data Pengguna (Tabel Users)

Pada model pengguna, saya mengenkripsi data identitas dasar agar tidak bisa dibaca langsung dari database.

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    // ... konfigurasi lainnya ...

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected function casts(): array
    {
        return [
            // Data sensitif yang dienkripsi di database
            'first_name'  => 'encrypted',
            'middle_name' => 'encrypted',
            'last_name'   => 'encrypted',

            // Contoh field biasa yang tidak dienkripsi
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }
}

Mengenkripsi Data Profil dan Dokumen (Tabel User Profiles)

Data profil biasanya jauh lebih sensitif, seperti alamat rumah dan kartu identitas. saya juga menerapkan casting encrypted pada model ini.

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class UserProfile extends Model
{
    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected function casts(): array
    {
        return [
            'place_of_birth'  => 'encrypted',
            'date_of_birth'   => 'encrypted',
            'phone_number'    => 'encrypted',
            'address'         => 'encrypted',

            // Bahkan path letak file KTP juga dienkripsi
            'ktp_path'        => 'encrypted',
            'selfie_ktp_path' => 'encrypted',
        ];
    }
}

Bagaimana Cara Kerjanya di Balik Layar?

Dengan menambahkan casting 'encrypted' seperti kode di atas, proses enkripsi dan dekripsi terjadi secara otomatis (transparan) tanpa mengganggu logika bisnis di Controller yang ada pada Janjio.

Sehingga saat menyimpan Data:

$profile = new UserProfile();
// Kita menulis data seperti biasa dalam bentuk teks
$profile->phone_number = '081234567890'; 
$profile->address = 'Jl. Jenderal Sudirman No 1';

// Saat method save() dipanggil, Laravel akan otomatis 
// mengenkripsi nomor telepon dan alamat sebelum masuk ke database.
$profile->save(); 

Database yang berisi kolom phone_number akan terlihat seperti string acak yang panjang (misalnya: eyJpdiI6IkhK...), bukan '081234567890'.

Saat Mengambil Data:

$profile = UserProfile::find(1);

// Saat kita mengakses properti, Laravel otomatis men-dekripsi datanya
echo $profile->phone_number; 
// Output: 081234567890 (teks asli kembali)

Begitulah kurang lebih proses yang terjadi di balik layar, dan satu bagian penting dari proses tersebut adalah KEY : kunci yang digunakan untuk membuka data tersebut.

Di Laravel, kunci ini adalah APP_KEY yang disimpan di dalam file .env.

APP_KEY=base64:XyZ...KunciRahasiaAnda...123=

Karena kunci ini sangat penting, saya tidak menempatkan file .env di area yang bisa diakses langsung dari web.

Bahkan, source code Laravel Janjio sendiri tidak saya letakkan begitu saja di dalam public_html. Saya hanya menempatkan folder public Laravel sebagai bagian yang dapat diakses oleh web server, sementara file dan konfigurasi lainnya tetap berada di luar area tersebut.

Dengan cara ini, saya ingin memastikan bahwa ketika seseorang mencoba mengakses file aplikasi dari luar, yang bisa diakses hanyalah bagian yang memang seharusnya terbuka untuk publik.

Dan jika suatu saat seseorang hanya mendapatkan salinan database, tanpa APP_KEY, data yang sudah terenkripsi tetap tidak bisa begitu saja dibaca kembali.

Bagi saya, di sinilah enkripsi menjadi lebih dari sekadar mengubah data menjadi teks acak. Data yang dikunci harus dijaga, dan kunci untuk membukanya juga harus dijaga.

Dengan memanfaatkan Encrypted Casting yang sudah tersedia di Laravel, saya bisa menerapkan lapisan perlindungan ini tanpa harus membuat sistem enkripsi sendiri dari awal.

Terimakasih sudah membaca sampai akhir, sampai jumpa di tulisan lainnya.