Come usare l'estensione Sodium PHP in ServBay
ServBay, come potente ambiente integrato per lo sviluppo web locale, include e abilita di default l’estensione Sodium per PHP. Sodium è una moderna libreria di crittografia, semplice da usare e largamente adottata per la cifratura dei dati e la comunicazione sicura. Grazie a ServBay, gli sviluppatori possono utilizzare facilmente l’estensione Sodium nelle applicazioni PHP per cifrare e decifrare dati senza necessità di compilazioni o configurazioni aggiuntive, garantendo così la sicurezza delle proprie applicazioni.
Introduzione all’estensione Sodium
Sodium (libsodium) è una libreria crittografica moderna progettata per offrire funzionalità di cifratura semplici, sicure e facili da utilizzare. Supporta svariati algoritmi e operazioni crittografiche, come cifratura simmetrica, asimmetrica, firme digitali, hashing e scambio di chiavi. A partire da PHP 7.2, la libreria Sodium è stata integrata come estensione principale di PHP, rappresentando la soluzione moderna e più sicura in sostituzione dell’ormai deprecata libreria mcrypt.
Caratteristiche principali
- Semplicità d’uso: offre un’API essenziale e intuitiva, facilitando la cifratura e la decifratura dei dati da parte degli sviluppatori.
- Elevata sicurezza: adotta algoritmi moderni e le best practice più recenti, assicurando la protezione dei dati.
- Multi-funzionalità: supporta crittografia simmetrica, asimmetrica, firme digitali, funzioni di hash, scambio di chiavi e molto altro.
- Cross-platform: utilizzabile su diversi sistemi operativi e linguaggi di programmazione.
- Efficienza delle prestazioni: operazioni di cifratura e decifratura estremamente efficienti, ideali per scenari dove le prestazioni sono cruciali.
Sodium come alternativa a mcrypt
La libreria mcrypt era storicamente molto usata per la crittografia in PHP, ma poiché non è più mantenuta e presenta problemi di sicurezza, è stata deprecata a partire da PHP 7.1 e rimossa in PHP 7.2. Sodium è stata introdotta proprio come sostituto moderno e sicuro. Offrendo un livello superiore di sicurezza, facilità d’uso e migliori performance, si raccomanda caldamente di utilizzare Sodium al posto di mcrypt in tutti i nuovi progetti PHP che richiedono cifratura e decifratura dei dati.
Disponibilità e attivazione di Sodium in ServBay
ServBay compila e abilita di default l’estensione Sodium su tutte le versioni PHP 7.2 e successive incluse nel pacchetto. Questo significa che, come utente di ServBay, non è necessario installare o configurare manualmente l’estensione Sodium: basta avviare ServBay ed eseguire la versione PHP desiderata per poter utilizzare subito le funzioni Sodium nel proprio codice.
Per verificare che Sodium sia attivo, è sufficiente consultare la funzione phpinfo() offerta da ServBay. Seleziona la versione PHP in uso dalla dashboard di ServBay, accedi all'opzione phpinfo()
e cerca sul risultato la voce ‘sodium’: dovresti vedere le informazioni relative al modulo Sodium.
Utilizzo dell’estensione Sodium nel codice PHP
Verificata la presenza dell’estensione, puoi utilizzare subito le sue funzioni nei tuoi progetti PHP. Salva il file di codice PHP nella sottocartella dedicata al sito all’interno della root dei siti ServBay (per default /Applications/ServBay/www
), quindi accedilo tramite browser. Ecco alcune applicazioni di base con esempi pratici:
Esempio di codice (Crittografia simmetrica)
La crittografia simmetrica impiega la stessa chiave sia per cifrare che per decifrare.
php
<?php
// Messaggio da cifrare
$message = "This is a secret message from servbay.demo";
// Genera una chiave casuale (lunghezza fissa SODIUM_CRYPTO_SECRETBOX_KEYBYTES)
$key = sodium_crypto_secretbox_keygen();
// Genera un Nonce casuale (numero usato una volta), deve essere lo stesso sia per cifrare che per decifrare
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
// Cifra usando la chiave e il Nonce
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);
echo "Messaggio originale: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // Il nonce va generalmente conservato o trasmesso insieme al cifrato
echo "Cifrato (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- Processo di decifratura ---
// Si presume di avere già cifrato, nonce e chiave
$retrieved_ciphertext = $ciphertext; // Cifrato recuperato da storage o trasmissione
$retrieved_nonce = $nonce; // Nonce recuperato da storage o trasmissione
$retrieved_key = $key; // Chiave recuperata da storage o trasmissione
// Decifra usando la chiave e il Nonce
$decrypted = sodium_crypto_secretbox_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_key);
// Verifica se la decifratura è avvenuta con successo
if ($decrypted === false) {
echo "Decifratura fallita!\n";
} else {
echo "Messaggio decifrato: " . $decrypted . "\n";
}
// Pulisci i dati sensibili dalla memoria
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
Esempio di codice (Crittografia asimmetrica)
La crittografia asimmetrica utilizza una coppia di chiavi: la chiave pubblica per cifrare, la chiave privata per decifrare.
php
<?php
// Messaggio da cifrare
$message = "This is another secret message for servbay-demo user";
// Genera una coppia di chiavi (pubblica per cifrare, privata per decifrare)
$keypair = sodium_crypto_box_keypair();
$publicKey = sodium_crypto_box_publickey($keypair); // Da rendere pubblico agli altri
$secretKey = sodium_crypto_box_secretkey($keypair); // Da conservare privatamente, mai condividere
echo "Chiave pubblica (Base64): " . base64_encode($publicKey) . "\n";
echo "Chiave privata (Base64): [La chiave privata è sensibile, non deve essere mostrata o diffusa]\n\n";
// --- Fase di cifratura (con la chiave pubblica del destinatario) ---
// Supponiamo che il mittente abbia la $publicKey del destinatario
// Genera un Nonce casuale, deve essere usato identico per cifrare e decifrare
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
// Usa la chiave pubblica del destinatario e la privata del mittente (per semplicità usiamo la stessa coppia in questo esempio)
// Nota: nella pratica dovresti usare la chiave privata del mittente + la pubblica del destinatario
// La funzione crypto_box di Sodium in realtà sfrutta Diffie-Hellman su Curve25519, perciò sono necessarie le chiavi di entrambe le parti
// Per semplicità, in questo esempio lo stesso utente cifra e decifra
$ciphertext = sodium_crypto_box($message, $nonce, $keypair); // In questo esempio semplificato la keypair include entrambe le chiavi
echo "Messaggio originale: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // Il nonce va conservato/trasmesso insieme al cifrato
echo "Cifrato (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- Fase di decifratura (con la chiave privata del destinatario) ---
// Supponiamo che il destinatario possieda cifrato, nonce e la propria chiave privata ($secretKey), oltre alla chiave pubblica del mittente ($publicKey)
// In questo esempio semplificato utilizziamo $keypair
$retrieved_ciphertext = $ciphertext;
$retrieved_nonce = $nonce;
$retrieved_keypair = $keypair; // Usiamo la keypair contenente la chiave privata per decifrare
// Decifra con la propria coppia di chiavi
$decrypted = sodium_crypto_box_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_keypair);
// Verifica se la decifratura è avvenuta con successo
if ($decrypted === false) {
echo "Decifratura fallita!\n";
} else {
echo "Messaggio decifrato: " . $decrypted . "\n";
}
// Cancella i dati sensibili dalla memoria
sodium_memzero($secretKey); // Pulisci la chiave privata
sodium_memzero($keypair); // Pulisci l’intera coppia
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
Esempio di codice (Firma digitale)
La firma digitale serve per attestare l’integrità del messaggio e l’identità del mittente. Si firma con la chiave privata; si verifica con la pubblica.
php
<?php
// Messaggio da firmare
$message = "This message needs to be signed by servbay.demo";
// Genera una coppia di chiavi per firma (privata per firmare, pubblica per verificare)
$keypair = sodium_crypto_sign_keypair();
$publicKey = sodium_crypto_sign_publickey($keypair); // Da rendere pubblico a chi verifica
$secretKey = sodium_crypto_sign_secretkey($keypair); // Da custodire privatamente, mai condividere
echo "Chiave pubblica (Base64): " . base64_encode($publicKey) . "\n";
echo "Chiave privata (Base64): [La chiave privata è sensibile, non deve essere mostrata o diffusa]\n\n";
// --- Fase di firma (usando la chiave privata del mittente) ---
$signature = sodium_crypto_sign_detached($message, $secretKey);
echo "Messaggio originale: " . $message . "\n";
echo "Firma (Base64): " . base64_encode($signature) . "\n\n";
// --- Fase di verifica (usando la chiave pubblica del mittente) ---
// Si presume che il verificatore abbia il messaggio, la firma e la publicKey del mittente
$retrieved_message = $message;
$retrieved_signature = $signature;
$retrieved_publicKey = $publicKey;
// Verifica la firma colla chiave pubblica
if (sodium_crypto_sign_verify_detached($retrieved_signature, $retrieved_message, $retrieved_publicKey)) {
echo "Firma valida! Il messaggio è integro e proviene dal proprietario della chiave privata.\n";
} else {
echo "Firma non valida! Il messaggio potrebbe essere stato alterato, oppure la firma non corrisponde alla chiave privata.\n";
}
// Cancella i dati sensibili dalla memoria
sodium_memzero($secretKey); // Cancella la chiave privata
sodium_memzero($keypair); // Cancella la coppia
?>
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
Conclusioni
ServBay consente agli sviluppatori di sfruttare facilmente la potente estensione Sodium PHP, già preinstallata e abilitata di default, eliminando la complessità di installazione e configurazione in ambiente locale. Questo permette di concentrarsi sull’implementazione di solidi meccanismi crittografici per aumentare la sicurezza delle applicazioni. Sodium, moderno successore di mcrypt, è uno strumento fondamentale per progettare web app affidabili e sicure. Con ServBay, adottare le migliori pratiche di crittografia per lo sviluppo locale è facile, veloce e sicuro.