Hoe gebruik je de Sodium PHP-extensie in ServBay
ServBay is een krachtige geïntegreerde lokale webontwikkelomgeving die standaard wordt geleverd met de ingeschakelde Sodium PHP-extensie. Sodium is een moderne en gebruiksvriendelijke encryptiebibliotheek die veel wordt ingezet voor gegevensversleuteling en veilige communicatie. Dankzij ServBay kunnen ontwikkelaars zonder extra compilatie of configuratie eenvoudig de Sodium-extensie gebruiken in hun PHP-applicaties voor het versleutelen en ontsleutelen van gegevens, waardoor de veiligheid van de applicatie wordt gewaarborgd.
Introductie tot de Sodium-extensie
Sodium (libsodium) is een moderne encryptiebibliotheek die is ontworpen om eenvoudige, gebruiksvriendelijke en veilige encryptiefuncties te bieden. De library ondersteunt verschillende encryptie-algoritmes en operaties, zoals symmetrische encryptie, asymmetrische encryptie, digitale handtekeningen, hashen en sleuteldistributie. Sinds PHP versie 7.2 is de Sodium library als kernextensie opgenomen in PHP en vormt het een moderne en veiligere vervanger voor de inmiddels verouderde mcrypt-library.
Belangrijkste kenmerken
- Gebruiksgemak: Biedt een eenvoudige API die het ontwikkelaars makkelijk maakt om data te versleutelen of te ontsleutelen.
- Hoge beveiliging: Maakt gebruik van moderne encryptie-algoritmes en best practices voor maximale gegevensbeveiliging.
- Veelzijdigheid: Ondersteunt symmetrische en asymmetrische encryptie, digitale handtekeningen, hashing, sleuteldistributie en meer.
- Platformonafhankelijk: Beschikbaar op verschillende besturingssystemen en programmeertalen.
- Hoge prestaties: Snelle encryptie- en decryptiebewerkingen, geschikt voor veeleisende toepassingen.
Sodium als alternatief voor mcrypt
De mcrypt-library was ooit de meest gebruikte encryptiebibliotheek in PHP, maar wordt niet meer onderhouden en bevatte mogelijk beveiligingslekken. Daarom werd mcrypt verwijderd in PHP 7.2 en eerder al afgeschreven in PHP 7.1. Als modern en veilig alternatief is Sodium toegevoegd aan PHP. Deze library biedt meer beveiliging, gebruiksgemak en betere prestaties. Het wordt dan ook sterk aanbevolen om in nieuwe projecten Sodium te gebruiken in plaats van mcrypt, voor het versleutelen en ontsleutelen van gegevens.
Beschikbaarheid en activering van Sodium in ServBay
In PHP 7.2 en alle nieuwere versies levert ServBay een vooraf gecompileerde en standaard geactiveerde Sodium-extensie mee. Dit betekent dat gebruikers van ServBay niets handmatig hoeven te installeren of te configureren. Start simpelweg ServBay, kies de gewenste PHP-versie en je kunt direct aan de slag met Sodium-functies in je code.
Je kunt controleren of Sodium geactiveerd is via de phpinfo() functie in ServBay. Kies in de ServBay-interface de gebruikte PHP-versie, zoek het phpinfo()
-onderdeel en zoek vervolgens in de uitvoer naar 'sodium'—je zou nu informatie over de Sodium-extensie moeten zien.
Sodium-extensie gebruiken in PHP-code
Als je hebt gecontroleerd dat de Sodium-extensie geactiveerd is, kun je de bijbehorende functies direct in jouw PHP-projecten gebruiken. Sla je PHP-bestanden op in de webroot van ServBay (standaard /Applications/ServBay/www
), in de submap van de betreffende website, en open ze vervolgens via de browser. Hieronder volgen enkele basistoepassingen met codevoorbeelden:
Voorbeeldcode (symmetrische encryptie)
Symmetrische encryptie gebruikt één sleutel om zowel te versleutelen als te ontsleutelen.
php
<?php
// Bericht dat versleuteld moet worden
$message = "This is a secret message from servbay.demo";
// Genereer een willekeurige sleutel (sleutellengte is exact SODIUM_CRYPTO_SECRETBOX_KEYBYTES)
$key = sodium_crypto_secretbox_keygen();
// Genereer een willekeurige Nonce (Number used once), gebruik voor encryptie en decryptie steeds dezelfde Nonce
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
// Versleutel het bericht met de sleutel en de Nonce
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);
echo "Oorspronkelijk bericht: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // Nonce moet samen met de ciphertext opgeslagen of verstuurd worden
echo "Ciphertext (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- Decryptie ---
// Stel, je hebt de ciphertext, Nonce en sleutel beschikbaar gekregen
$retrieved_ciphertext = $ciphertext; // Ciphertext ontvangen uit opslag of overdracht
$retrieved_nonce = $nonce; // Nonce ontvangen uit opslag of overdracht
$retrieved_key = $key; // Sleutel ontvangen uit opslag of overdracht
// Ontsleutel het bericht
$decrypted = sodium_crypto_secretbox_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_key);
// Controleer of het ontsleutelen is gelukt
if ($decrypted === false) {
echo "Ontsleutelen mislukt!\n";
} else {
echo "Ontsleuteld bericht: " . $decrypted . "\n";
}
// Verwijder gevoelige gegevens uit het geheugen
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
Voorbeeldcode (asymmetrische encryptie)
Bij asymmetrische encryptie wordt een sleutelpaar gebruikt: met de publieke sleutel versleutel je, met de private sleutel ontsleutel je.
php
<?php
// Bericht dat versleuteld moet worden
$message = "This is another secret message for servbay-demo user";
// Genereer sleutelpaar (publieke sleutel voor encryptie, private sleutel voor decryptie)
$keypair = sodium_crypto_box_keypair();
$publicKey = sodium_crypto_box_publickey($keypair); // Deelbaar met anderen
$secretKey = sodium_crypto_box_secretkey($keypair); // Privé bewaren, nooit openbaar maken
echo "Publieke sleutel (Base64): " . base64_encode($publicKey) . "\n";
echo "Private sleutel (Base64): [Gevoelige sleutel, niet tonen of delen]\n\n";
// --- Encryptie (met publieke sleutel ontvanger) ---
// Stel dat de zender de $publicKey van de ontvanger heeft
// Genereer een willekeurige Nonce, voor encryptie en decryptie wordt dezelfde Nonce gebruikt
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
// Encryptie met de publieke sleutel van de ontvanger en de private sleutel van de zender
// Let op: in praktische toepassingen zou je eigen private sleutel én de publieke sleutel van de ontvanger combineren.
// Sodium's crypto_box gebruikt feitelijk een Diffie-Hellman sleuteldeling op basis van Curve25519, waardoor beide sleutels nodig zijn.
// Voor deze vereenvoudigde demo wordt één en hetzelfde sleutelpaar gebruikt, dus encryptie en decryptie door dezelfde gebruiker.
$ciphertext = sodium_crypto_box($message, $nonce, $keypair); // Vereenvoudigd, $keypair bevat beide sleutels
echo "Oorspronkelijk bericht: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // Nonce opslaan of meesturen met de ciphertext
echo "Ciphertext (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- Decryptie (met private sleutel ontvanger) ---
// Stel dat de ontvanger beschikt over ciphertext, Nonce en zijn eigen private sleutel ($secretKey), plus de publieke sleutel van de zender ($publicKey).
// Hier gebruiken we nogmaals het hele $keypair, omdat het een demo is.
$retrieved_ciphertext = $ciphertext;
$retrieved_nonce = $nonce;
$retrieved_keypair = $keypair; // Bevat de private sleutel voor decryptie
// Ontsleutel het bericht met het eigen sleutelpaar
$decrypted = sodium_crypto_box_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_keypair);
// Controleer of het ontsleutelen is gelukt
if ($decrypted === false) {
echo "Ontsleutelen mislukt!\n";
} else {
echo "Ontsleuteld bericht: " . $decrypted . "\n";
}
// Maak gevoelige gegevens onleesbaar in het geheugen
sodium_memzero($secretKey); // Private sleutel
sodium_memzero($keypair); // Sleutelpaar
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
55
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
55
Voorbeeldcode (digitale handtekening)
Digitale handtekeningen worden gebruikt om de integriteit van een bericht en de identiteit van de verzender te controleren. Ondertekenen gebeurt met de privé sleutel, verificatie met de publieke sleutel.
php
<?php
// Bericht dat ondertekend moet worden
$message = "This message needs to be signed by servbay.demo";
// Genereer een sleutelpaar voor ondertekenen (private sleutel tekent, public controleert)
$keypair = sodium_crypto_sign_keypair();
$publicKey = sodium_crypto_sign_publickey($keypair); // Vrij beschikbaar stellen voor verificatie
$secretKey = sodium_crypto_sign_secretkey($keypair); // Enkel privé bewaren
echo "Publieke sleutel (Base64): " . base64_encode($publicKey) . "\n";
echo "Private sleutel (Base64): [Gevoelige sleutel, niet tonen of delen]\n\n";
// --- Ondertekenen (met private sleutel verzender) ---
$signature = sodium_crypto_sign_detached($message, $secretKey);
echo "Oorspronkelijk bericht: " . $message . "\n";
echo "Handtekening (Base64): " . base64_encode($signature) . "\n\n";
// --- Verificatie (met publieke sleutel verzender) ---
// Stel dat de ontvanger over het bericht, de handtekening en de publieke sleutel van de verzender ($publicKey) beschikt
$retrieved_message = $message;
$retrieved_signature = $signature;
$retrieved_publicKey = $publicKey;
// Controleer handtekening met publieke sleutel
if (sodium_crypto_sign_verify_detached($retrieved_signature, $retrieved_message, $retrieved_publicKey)) {
echo "Handtekening is geldig! Het bericht is niet veranderd en is afkomstig van de houder van de juiste private sleutel.\n";
} else {
echo "Handtekening ongeldig! Het bericht is mogelijk gewijzigd, of niet ondertekend met de juiste private sleutel.\n";
}
// Maak gevoelige gegevens onleesbaar in het geheugen
sodium_memzero($secretKey); // Private sleutel
sodium_memzero($keypair); // Sleutelpaar
?>
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
Samenvatting
Met ServBay kunnen ontwikkelaars eenvoudig gebruikmaken van de vooraf geïnstalleerde en standaard geactiveerde Sodium PHP-extensie. Dit maakt het installeren en configureren van Sodium op een lokale ontwikkelmachine overbodig, zodat je je volledig kunt richten op het beter beveiligen van je applicatie met de krachtige encryptiemogelijkheden van Sodium. Als moderne opvolger van mcrypt is Sodium onmisbaar voor het bouwen van veilige en betrouwbare webapplicaties. ServBay vereenvoudigt het hele proces en ondersteunt ontwikkelaars bij het creëren van een efficiënte en veilige lokale ontwikkelomgeving.