Cómo usar la extensión Sodium de PHP en ServBay
ServBay, un potente entorno de desarrollo web local, incluye y habilita por defecto la extensión Sodium de PHP. Sodium es una biblioteca de cifrado moderna y fácil de usar, ampliamente utilizada para la encriptación de datos y la comunicación segura. Gracias a ServBay, los desarrolladores pueden emplear la extensión Sodium en sus aplicaciones PHP para cifrar y descifrar datos de forma sencilla, sin necesidad de compilaciones ni configuraciones adicionales, garantizando así la seguridad de la información en sus aplicaciones.
Introducción a la extensión Sodium
Sodium (libsodium) es una biblioteca de cifrado moderna diseñada para ofrecer funcionalidades criptográficas simples, fáciles de usar y seguras. Soporta diversos algoritmos y operaciones de cifrado como cifrado simétrico, cifrado asimétrico, firmas digitales, cálculo de hashes e intercambio de claves. Desde PHP 7.2, la biblioteca Sodium está integrada como extensión principal en PHP, convirtiéndose en la alternativa moderna y más segura al obsoleto mcrypt.
Características principales
- Facilidad de uso: Ofrece una API sencilla para que los desarrolladores puedan cifrar y descifrar datos fácilmente.
- Alta seguridad: Utiliza algoritmos de cifrado modernos y las mejores prácticas para garantizar la protección de los datos.
- Multifuncionalidad: Soporta cifrado simétrico, cifrado asimétrico, firmas digitales, cálculo de hashes, intercambio de claves y más.
- Multiplataforma: Disponible en varios sistemas operativos y lenguajes de programación.
- Rendimiento eficiente: Las operaciones de cifrado y descifrado son rápidas, lo que la hace ideal para aplicaciones donde el rendimiento es clave.
Sodium como reemplazo de mcrypt
La biblioteca mcrypt fue ampliamente utilizada en PHP para operaciones de cifrado, pero al dejar de recibir mantenimiento y presentar vulnerabilidades de seguridad, fue descontinuada en PHP 7.1 y eliminada oficialmente en PHP 7.2. Sodium fue incorporada como reemplazo moderno y seguro. Ofrece mayor seguridad, simplicidad y un rendimiento superior frente a mcrypt, por lo que se recomienda encarecidamente utilizar Sodium en proyectos nuevos para la gestión de cifrado y descifrado de datos.
Disponibilidad y activación de Sodium en ServBay
ServBay viene con la extensión Sodium precompilada y habilitada por defecto en PHP 7.2 y versiones superiores. Esto significa que, como usuario de ServBay, no necesitas realizar ninguna instalación ni configuración adicional. Simplemente inicia ServBay y ejecuta la versión de PHP deseada para comenzar a utilizar las funciones de Sodium directamente en tus proyectos.
Para verificar si Sodium está activa, puedes utilizar la función phpinfo() de ServBay. En la interfaz de ServBay selecciona la versión de PHP que vas a usar, busca la opción phpinfo()
y, en la página de resultados, localiza 'sodium'; ahí deberías ver la información del módulo Sodium.
Uso de la extensión Sodium en código PHP
Una vez confirmada la activación de Sodium, puedes utilizar sus funciones en tu proyecto PHP. Guarda tus archivos PHP en el subdirectorio correspondiente dentro del directorio raíz del sitio de ServBay (por defecto /Applications/ServBay/www
), y accédelos a través del navegador para ejecutarlos. A continuación, se muestran algunos ejemplos básicos de uso:
Ejemplo de código (cifrado simétrico)
El cifrado simétrico utiliza la misma clave tanto para cifrar como para descifrar.
php
<?php
// Mensaje que se va a cifrar
$message = "This is a secret message from servbay.demo";
// Generar una clave aleatoria (la longitud de la clave debe ser SODIUM_CRYPTO_SECRETBOX_KEYBYTES)
$key = sodium_crypto_secretbox_keygen();
// Generar un Nonce aleatorio (Number used once); debe usarse el mismo Nonce en cifrado y descifrado
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
// Cifrar usando la clave y el Nonce
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);
echo "Mensaje original: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // El Nonce normalmente se almacena o transmite junto con el cifrado
echo "Texto cifrado (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- Proceso de descifrado ---
// Supongamos que ya tenemos el texto cifrado, el Nonce y la clave
$retrieved_ciphertext = $ciphertext; // Texto cifrado recuperado del almacenamiento o transmisión
$retrieved_nonce = $nonce; // Nonce recuperado del almacenamiento o transmisión
$retrieved_key = $key; // Clave recuperada del almacenamiento o transmisión
// Descifrar usando la clave y el Nonce
$decrypted = sodium_crypto_secretbox_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_key);
// Verificar si el descifrado fue exitoso
if ($decrypted === false) {
echo "¡Desencriptado fallido!\n";
} else {
echo "Mensaje desencriptado: " . $decrypted . "\n";
}
// Limpiar datos sensibles para evitar fugas de 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
Ejemplo de código (cifrado asimétrico)
El cifrado asimétrico utiliza un par de claves: una pública para cifrar y una privada para descifrar.
php
<?php
// Mensaje que se va a cifrar
$message = "This is another secret message for servbay-demo user";
// Generar un par de claves (clave pública para cifrar, clave privada para descifrar)
$keypair = sodium_crypto_box_keypair();
$publicKey = sodium_crypto_box_publickey($keypair); // Compartir con el destinatario
$secretKey = sodium_crypto_box_secretkey($keypair); // Mantener en secreto, nunca compartir
echo "Clave pública (Base64): " . base64_encode($publicKey) . "\n";
echo "Clave privada (Base64): [La clave privada es confidencial, no debe mostrarse ni compartirse]\n\n";
// --- Proceso de cifrado (utilizando la clave pública del receptor) ---
// Supongamos que el emisor tiene la $publicKey del receptor
// Generar un Nonce aleatorio, debe usarse el mismo en cifrado y descifrado
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
// Usar la clave pública del receptor y la clave privada del emisor (en la práctica, se negocian ambas claves: la pública del receptor y la privada propia)
// Nota: En este ejemplo simplificado, usamos el par de claves generado; en aplicaciones reales se utilizan la clave privada del emisor y la clave pública del receptor
// Sodium crypto_box se basa en el intercambio de claves Diffie-Hellman sobre Curve25519, por lo que se requiere las claves públicas y privadas de ambas partes
// Para simplificar el ejemplo, asumimos que el emisor y receptor son la misma persona
$ciphertext = sodium_crypto_box($message, $nonce, $keypair); // En este ejemplo simplificado, keypair incluye ambas claves
echo "Mensaje original: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // El Nonce debe almacenarse o transmitirse junto con el texto cifrado
echo "Texto cifrado (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- Proceso de descifrado (utilizando la clave privada del receptor) ---
// Supongamos que el receptor tiene el texto cifrado, el Nonce y su propia clave privada ($secretKey), así como la clave pública del emisor ($publicKey)
// En este ejemplo simplificado, nuevamente utilizamos $keypair
$retrieved_ciphertext = $ciphertext;
$retrieved_nonce = $nonce;
$retrieved_keypair = $keypair; // Usar el par de claves con la privada para descifrar
// Descifrar usando el par de claves propio
$decrypted = sodium_crypto_box_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_keypair);
// Verificar si el descifrado fue exitoso
if ($decrypted === false) {
echo "¡Desencriptado fallido!\n";
} else {
echo "Mensaje desencriptado: " . $decrypted . "\n";
}
// Limpiar datos sensibles
sodium_memzero($secretKey); // Limpiar la clave privada
sodium_memzero($keypair); // Limpiar el par de claves
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
Ejemplo de código (firma digital)
La firma digital se utiliza para verificar la integridad del mensaje y la identidad del remitente. Se firma usando la clave privada y se verifica con la clave pública.
php
<?php
// Mensaje a firmar
$message = "This message needs to be signed by servbay.demo";
// Generar un par de claves de firma (clave privada para firmar, clave pública para verificar)
$keypair = sodium_crypto_sign_keypair();
$publicKey = sodium_crypto_sign_publickey($keypair); // Compartir con quien verifica
$secretKey = sodium_crypto_sign_secretkey($keypair); // Mantener en secreto, nunca compartir
echo "Clave pública (Base64): " . base64_encode($publicKey) . "\n";
echo "Clave privada (Base64): [La clave privada es confidencial, no debe mostrarse ni compartirse]\n\n";
// --- Proceso de firma (usando la clave privada del remitente) ---
$signature = sodium_crypto_sign_detached($message, $secretKey);
echo "Mensaje original: " . $message . "\n";
echo "Firma (Base64): " . base64_encode($signature) . "\n\n";
// --- Proceso de verificación (con la clave pública del remitente) ---
// Supongamos que quien verifica tiene el mensaje, la firma y la clave pública del remitente ($publicKey)
$retrieved_message = $message;
$retrieved_signature = $signature;
$retrieved_publicKey = $publicKey;
// Verificar la firma usando la clave pública
if (sodium_crypto_sign_verify_detached($retrieved_signature, $retrieved_message, $retrieved_publicKey)) {
echo "¡Firma válida! El mensaje no ha sido alterado y proviene realmente de quien posee la clave privada.\n";
} else {
echo "¡Firma inválida! El mensaje pudo haber sido modificado, o la firma no fue generada con la clave privada correspondiente.\n";
}
// Limpiar datos sensibles
sodium_memzero($secretKey); // Limpiar clave privada
sodium_memzero($keypair); // Limpiar par de claves
?>
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
Conclusión
Con ServBay, los desarrolladores pueden beneficiarse de la extensión Sodium de PHP preinstalada y habilitada por defecto. Esto elimina la complejidad de instalación y configuración en entornos locales, permitiéndote centrarte en aprovechar las potentes funcionalidades de cifrado de Sodium para mejorar la seguridad de tus aplicaciones. Como sustituto moderno de mcrypt, Sodium es una herramienta clave para construir aplicaciones web seguras y confiables. ServBay simplifica este proceso y ayuda a los desarrolladores a crear entornos de desarrollo local eficientes y seguros.