SecureVote adalah sebuah sistem informasi pemilihan (e-voting) terpusat berbasis web yang dikembangkan khusus untuk pemilihan Gubernur ITSA PCR (Information Technology Student Association - Politeknik Caltex Riau). Proyek ini dibangun menggunakan framework Laravel 11, dirancang untuk memastikan kerahasiaan, keamanan, dan integritas penuh dalam setiap tahap pemilihan.
Sistem ini diintegrasikan secara mendalam dengan konsep Matematika Diskrit, khususnya penerapan Teori Himpunan & Logika Proposisional dalam arsitektur keamanan login dan validasi suara.
- Otentikasi Berlapis Berbasis Teori Himpunan & Logika Proposisional
- Kerahasiaan Suara dengan Enkripsi AES-256-CBC
- Pencegahan Double-Vote (Pemilihan Ganda)
- Three-Tier Role Management (Super Admin, Panitia KPU, dan Pemilih/Mahasiswa)
- UI/UX Modern (Deep Space Glassmorphism)
Keunikan utama dari sistem SecureVote adalah penggunaan landasan Matematika Diskrit yang ketat, khususnya Teori Himpunan dan Logika Proposisional pada saat pengguna melakukan login ke dalam sistem.
Sistem memandang entitas data pengguna sebagai elemen-elemen dalam himpunan tertentu:
- Himpunan Semesta (U): Seluruh data mahasiswa ITSA PCR yang tercatat di sistem.
- Himpunan A: Himpunan entitas mahasiswa yang memberikan kredensial (NIM & Password) yang valid.
- Himpunan B: Himpunan entitas mahasiswa yang memiliki status akun Aktif (
is_active = true). - Himpunan C: Himpunan entitas mahasiswa yang Belum Memilih (
is_voted = false).
Untuk dapat menembus gerbang login dengan sukses, seorang pengguna (
Sedangkan untuk berhak melakukan Pencoblosan (Voting), pengguna wajib berada pada irisan ketiga himpunan tersebut:
Proses validasi logika kode backend Laravel diterjemahkan secara harfiah dari batasan Himpunan di atas. Kami mendefinisikan 4 variabel proposisi utama:
- p: NIM pengguna terdaftar di database.
- q: Password pengguna cocok (hash matching).
- r: Status akun pengguna dalam keadaan Aktif (
is_active = true). - s: Pengguna belum memberikan suara pada periode berjalan (
is_voted = false).
Sistem menggunakan konjungsi (
-
Gagal Login (NIM Tidak Ditemukan):
$\lnot p$ Sistem langsung menolak karena proposisi identitas ($p$) bernilai False. -
Gagal Login (Password Salah):
$p \land \lnot q$ Identitas benar, tetapi otentikasi sandi ($q$) bernilai False. -
Gagal Login (Akun Nonaktif):
$p \land q \land \lnot r$ Kredensial sepenuhnya benar, tetapi otoritas sistem menetapkan akun ditangguhkan ($r$ bernilai False). -
Login Berhasil (Otentikasi Awal Valid):
$p \land q \land r$ Seluruh kondisi bernilai True. Pengguna diizinkan masuk ke Dasbor Pemilih.
Setelah pengguna masuk (login), sistem tidak langsung memberikan akses kertas suara. Ada Middleware Validator yang memeriksa proposisi sisa:
-
Hak Suara Sah (Akses Kertas Suara Diizinkan):
$p \land q \land r \land s$ Seluruh nilai proposisi adalah True. Pengguna dipersilakan untuk menekan tombol "Coblos". -
Akses Ditolak (Sudah Memilih):
$(p \land q \land r) \land \lnot s$ Pengguna aktif, tetapi mereka sudah pernah mencoblos ($s$ berubah menjadi False). Sistem seketika memblokir komponen pencoblosan, yang secara fungsional bertindak sebagai Absolute Double-Vote Protection.
Arsitektur database SecureVote didesain dengan ketat menggunakan Foreign Key dan relasi antar tabel (RDBMS). Berikut adalah relasi utama yang digunakan dalam Eloquent ORM Laravel:
Setiap akun pengguna (User) wajib memiliki satu peran (Role), yang menentukan tingkat otoritas mereka (Admin, Panitia, atau Pemilih).
-
User
belongsToRole:$user->role->name -
Role
hasManyUsers:$role->users
Setiap Kandidat Paslon terikat pada satu Periode Pemilihan secara eksklusif. Hal ini memungkinkan sistem menyimpan riwayat kandidat dari tahun-tahun sebelumnya tanpa bercampur dengan kandidat tahun aktif.
- Candidate
belongsToVotingPeriod - VotingPeriod
hasManyCandidates
Setiap suara (Vote) merekam voting_period_id dan candidate_id. Uniknya, ID Kandidat (candidate_id) juga dienkripsi ke dalam kolom encrypted_choice menggunakan metode AES-256-CBC, sehingga DBA (Database Administrator) yang melihat tabel votes tidak dapat membaca secara langsung siapa yang dipilih oleh seorang voter tanpa kunci aplikasi.
- Sistem membatasi relasi seorang pemilih (
User) hanya memiliki maksimal 1 suara (Vote) pada periode pemilihan yang sedang berlangsung (One-to-One secara fungsional dalam satu siklus).
- PHP >= 8.2
- Composer
- Database MySQL/MariaDB
- Lakukan clone repository ini:
git clone <repo-url> - Masuk ke direktori aplikasi:
cd securevote_app - Salin file environment:
cp .env.example .env - Sesuaikan konfigurasi database di file
.env. - Install dependensi:
composer install - Generate App Key (Penting untuk algoritma enkripsi suara):
php artisan key:generate - Lakukan migrasi beserta Seeder bawaan:
php artisan migrate:fresh --seed
- Jalankan server:
php artisan serve
Seeder secara otomatis membuat beberapa akun uji coba dengan password default password123.
- Admin System:
ADMIN01 - Panitia KPU:
PANITIA01 - Pemilih/Voter:
2501001,2501002,2501003
Untuk pengujian perlindungan ganda (Logika ¬s), Anda dapat masuk dengan akun pemilih, melakukan voting, lalu mencoba untuk login kembali dan mencoblos ulang.
Dibuat untuk memenuhi tugas Projek Implementasi Matematika Diskrit dan Pengembangan Sistem Cerdas.