Cara Menggunakan Ekstensi Sodium PHP di ServBay
ServBay sebagai lingkungan pengembangan web lokal terintegrasi yang andal, telah menyediakan dan mengaktifkan ekstensi Sodium PHP secara default. Sodium adalah pustaka enkripsi modern yang mudah digunakan, populer untuk enkripsi data dan komunikasi yang aman. Dengan ServBay, pengembang tidak perlu melakukan kompilasi atau konfigurasi tambahan untuk langsung menggunakan ekstensi Sodium pada aplikasi PHP, memastikan keamanan data aplikasi Anda.
Sekilas Mengenai Ekstensi Sodium
Sodium (libsodium) adalah pustaka enkripsi modern yang didesain untuk memberikan solusi kriptografi yang sederhana, mudah digunakan, dan aman. Sodium mendukung berbagai algoritma dan operasi enkripsi, seperti enkripsi simetris, enkripsi asimetris, tanda tangan digital, hash, dan pertukaran kunci. Sejak PHP versi 7.2, pustaka Sodium telah diintegrasikan sebagai ekstensi inti PHP—menjadi pengganti mcrypt yang sudah usang dan jauh lebih aman.
Fitur Utama
- Mudah digunakan: Menyediakan API yang sederhana, memudahkan developer dalam melakukan enkripsi maupun dekripsi data.
- Keamanan tinggi: Mengadopsi algoritma enkripsi modern dan praktik terbaik untuk menjamin keamanan data.
- Fungsionalitas luas: Mendukung berbagai operasi kriptografi, seperti enkripsi simetris/ asimetris, tanda tangan digital, hash, hingga pertukaran kunci.
- Lintas platform: Dapat digunakan di berbagai sistem operasi dan bahasa pemrograman.
- Performa tinggi: Operasi enkripsi dan dekripsi berjalan sangat efisien, cocok untuk aplikasi yang membutuhkan performa tinggi.
Sodium Sebagai Pengganti mcrypt
Pustaka mcrypt dahulu banyak digunakan untuk kebutuhan enkripsi di PHP, namun kini sudah tidak dipelihara dan ditemukan banyak celah keamanan; sejak PHP 7.1 pustaka ini dinonaktifkan dan dihapus di PHP 7.2. Sodium pun dihadirkan sebagai solusi pengganti yang modern dan aman. Pustaka Sodium menawarkan keamanan lebih baik, penggunaan lebih mudah, serta performa lebih optimal, sehingga sangat disarankan untuk menggunakan Sodium pada proyek-proyek baru sebagai pengganti mcrypt dalam melakukan enkripsi dan dekripsi data.
Ketersediaan & Aktivasi Sodium di ServBay
ServBay telah mem-build dan mengaktifkan ekstensi Sodium secara default pada PHP versi 7.2 ke atas. Artinya, sebagai pengguna ServBay, Anda tidak perlu menginstal atau mengonfigurasi Sodium secara manual. Cukup jalankan ServBay serta versi PHP yang diinginkan, Anda dapat langsung memakai fungsi Sodium di dalam kode.
Untuk memverifikasi apakah Sodium sudah aktif, Anda dapat menggunakan fitur phpinfo() di ServBay. Pilih versi PHP yang digunakan dari antarmuka ServBay, lalu pilih opsi phpinfo()
, dan cari 'sodium' pada halaman yang muncul; Anda akan menemukan informasi modul Sodium di sana.
Menggunakan Ekstensi Sodium di Kode PHP
Setelah memastikan bahwa ekstensi Sodium sudah aktif, Anda bisa memanfaatkan semua fungsi yang tersedia dalam proyek PHP Anda. Simpan file kode PHP di subdirektori situs dalam root folder website ServBay (default: /Applications/ServBay/www
), lalu akses menggunakan browser agar dapat dijalankan. Berikut beberapa contoh kode penggunaan dasar:
Contoh Kode (Enkripsi Simetris)
Pada enkripsi simetris, satu kunci digunakan baik untuk enkripsi maupun dekripsi.
php
<?php
// Pesan yang akan dienkripsi
$message = "This is a secret message from servbay.demo";
// Membuat kunci acak (panjang kunci harus SODIUM_CRYPTO_SECRETBOX_KEYBYTES)
$key = sodium_crypto_secretbox_keygen();
// Membuat Nonce (bilangan acak sekali pakai), harus sama pada proses enkripsi & dekripsi
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
// Melakukan enkripsi menggunakan kunci & Nonce
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);
echo "Pesan asli: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // Nonce biasanya disimpan atau dikirim bersama ciphertext
echo "Ciphertext (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- Proses dekripsi ---
// Misalnya ciphertext, Nonce, dan kunci didapatkan kembali dari penyimpanan/pengiriman
$retrieved_ciphertext = $ciphertext;
$retrieved_nonce = $nonce;
$retrieved_key = $key;
// Dekripsi menggunakan kunci & Nonce
$decrypted = sodium_crypto_secretbox_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_key);
// Cek apakah dekripsi berhasil
if ($decrypted === false) {
echo "Dekripsi gagal!\n";
} else {
echo "Pesan setelah didekripsi: " . $decrypted . "\n";
}
// Bersihkan data sensitif untuk mencegah kebocoran memori
sodium_memzero($key);
sodium_memzero($retrieved_key);
if ($decrypted !== false) {
sodium_memzero($decrypted);
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Contoh Kode (Enkripsi Asimetris)
Pada enkripsi asimetris, dibutuhkan sepasang kunci: kunci publik dan kunci privat. Kunci publik untuk enkripsi, kunci privat untuk dekripsi.
php
<?php
// Pesan yang akan dienkripsi
$message = "This is another secret message for servbay-demo user";
// Membuat keypair (kunci publik untuk enkripsi, privat untuk dekripsi)
$keypair = sodium_crypto_box_keypair();
$publicKey = sodium_crypto_box_publickey($keypair); // Diberikan kepada pihak lain
$secretKey = sodium_crypto_box_secretkey($keypair); // Disimpan sendiri, jangan dibocorkan
echo "Kunci publik (Base64): " . base64_encode($publicKey) . "\n";
echo "Kunci privat (Base64): [kunci privat bersifat rahasia, jangan ditampilkan atau dibocorkan]\n\n";
// --- Proses enkripsi (menggunakan kunci publik penerima) ---
// Misalkan pengirim punya $publicKey penerima
// Membuat Nonce acak, harus sama pada proses enkripsi & dekripsi
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
// Enkripsi menggunakan kunci publik penerima & kunci privat pengirim
// Catatan: dalam penggunaan nyata perlu negosiasi antara kunci publik penerima & kunci privat pengirim; contoh ini disederhanakan
// Sodium crypto_box berbasis Diffie-Hellman Curve25519, sehingga membutuhkan kombinasi pasangan kunci dari kedua pihak
// Untuk contoh ini, penggunaannya seolah hanya diri sendiri
$ciphertext = sodium_crypto_box($message, $nonce, $keypair);
echo "Pesan asli: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // Nonce harus dikirim/disimpan bersama ciphertext
echo "Ciphertext (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- Proses dekripsi (dengan kunci privat penerima) ---
// Diketahui ciphertext, Nonce, dan keypair (yang berisi kunci privat penerima & publik pengirim)
$retrieved_ciphertext = $ciphertext;
$retrieved_nonce = $nonce;
$retrieved_keypair = $keypair;
// Dekripsi menggunakan keypair sendiri
$decrypted = sodium_crypto_box_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_keypair);
// Cek apakah dekripsi berhasil
if ($decrypted === false) {
echo "Dekripsi gagal!\n";
} else {
echo "Pesan setelah didekripsi: " . $decrypted . "\n";
}
// Bersihkan data sensitif
sodium_memzero($secretKey); // Bersihkan kunci privat
sodium_memzero($keypair); // Bersihkan keypair
if ($decrypted !== false) {
sodium_memzero($decrypted);
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Contoh Kode (Tanda Tangan Digital)
Tanda tangan digital digunakan untuk memverifikasi keaslian pesan dan identitas pengirim. Tanda tangan dilakukan dengan kunci privat dan diverifikasi dengan kunci publik.
php
<?php
// Pesan yang akan ditandatangani
$message = "This message needs to be signed by servbay.demo";
// Membuat sepasang kunci tanda tangan (privat untuk tanda tangan, publik untuk verifikasi)
$keypair = sodium_crypto_sign_keypair();
$publicKey = sodium_crypto_sign_publickey($keypair); // Diberikan kepada verifier
$secretKey = sodium_crypto_sign_secretkey($keypair); // Disimpan sendiri, jangan dibocorkan
echo "Kunci publik (Base64): " . base64_encode($publicKey) . "\n";
echo "Kunci privat (Base64): [kunci privat bersifat rahasia, jangan ditampilkan atau dibocorkan]\n\n";
// --- Proses penandatanganan (dengan kunci privat pengirim) ---
$signature = sodium_crypto_sign_detached($message, $secretKey);
echo "Pesan asli: " . $message . "\n";
echo "Tanda tangan (Base64): " . base64_encode($signature) . "\n\n";
// --- Proses verifikasi (dengan kunci publik pengirim) ---
// Verifier punya pesan, signature, dan publicKey dari pengirim
$retrieved_message = $message;
$retrieved_signature = $signature;
$retrieved_publicKey = $publicKey;
// Verifikasi signature dengan kunci publik
if (sodium_crypto_sign_verify_detached($retrieved_signature, $retrieved_message, $retrieved_publicKey)) {
echo "Tanda tangan valid! Pesan asli dan benar-benar dari pemilik kunci privat.\n";
} else {
echo "Tanda tangan invalid! Pesan mungkin diubah atau signature tidak cocok dengan kunci privat.\n";
}
// Bersihkan data sensitif
sodium_memzero($secretKey); // Bersihkan kunci privat
sodium_memzero($keypair); // Bersihkan keypair
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Kesimpulan
Dengan ServBay, developer dapat dengan mudah menggunakan ekstensi Sodium PHP yang sudah terpasang dan diaktifkan secara default. Hal ini menghilangkan kerumitan instalasi dan konfigurasi Sodium di lingkungan lokal Anda, sehingga Anda dapat langsung fokus memaksimalkan kekuatan Sodium untuk meningkatkan keamanan aplikasi. Sebagai pengganti modern mcrypt, Sodium adalah alat penting untuk membangun aplikasi web yang aman dan andal. ServBay menyederhanakan seluruh proses ini, mendukung Anda dalam menciptakan lingkungan pengembangan lokal yang efisien dan aman.