Cifrar archivos con PHP

Resumen

Vamos a cifrar y descifrar archivos con PHP de dos maneras; la primera usando una clave “general” y otra con una contraseña.

Para cifrar y descifrar vamos a usar la librería php-encryption.

La diferencia es que con el segundo ejemplo podremos hacer que los usuarios tengan sus archivos cifrados con una contraseña que solo ellos sepan, y cada uno tendrá una clave distinta.

Ejemplo de uso de php-encryption

En un post anterior vimos cómo encriptar texto o datos como strings / variables en PHP.

Ahora vamos a ver cómo cifrar o encriptar archivos completos con PHP; es decir, no encriptar texto, sino archivos como imágenes, vídeos, documentos, etcétera.

Instalar librería php-encryption

Vamos a usar la misma librería que en el post citado. Si no la has instalado, ejecuta:

composer require defuse/php-encryption

En caso de que Composer no esté instalado mira cómo instalar Composer aquí; y si quieres adaptar tu proyecto puedes ver un tutorial aquí.

Nota: si quieres comprobar que estás descargando el archivo real y que nadie lo interceptó en el camino puedes descargar el archivo phar y comprobar las firmas.

Después de instalarla simplemente hay que requerir el autoload como veremos en los ejemplos.

require_once "vendor/autoload.php";

Cifrar con clave general

Recuerda que la clave puede ser generada con el ejecutable llamado generate-defuse-key ubicado en vendor/bin.

La clave debe estar guardada en un lugar seguro al que solo tú tengas acceso, pues quien tenga acceso podrá cifrar y descifrar a su gusto.

En el ejemplo de código estoy cifrando una imagen usando una clave que obtengo leyendo un archivo de texto.

El método File::encryptFile($rutaArchivoEntrada, $rutaArchivoSalida, $clave) toma la ruta de un archivo de entrada, lo cifra con la clave y el archivo cifrado lo pone en la ruta del archivo de salida.

Si quieres eliminar el archivo original simplemente usa unlink.

Descifrar con clave general

Ahora veamos cómo se podría descifrar el archivo cifrado anteriormente, igual con una clave.

Es muy similar al proceso para cifrar un archivo con PHP, solo que ahora el archivo de entrada es el archivo previamente encriptado; y se invoca al método decryptFile.

Lo digo de nuevo, para eliminar el archivo podrías usar unlink.

Cifrar con contraseña vs cifrar con clave

Existe otra manera de cifrar todo el contenido de un archivo con PHP y la librería php-encryption, y es usar una contraseña.

No te confundas, la clave y la contraseña son cosas distintas.

Una contraseña puede ser proporcionada por un usuario (así, cada usuario del sistema podría tener sus archivos seguros sin depender de una clave general)

La clave es una clave que podría decirse es especial y tiene un formato predefinido además de ser segura, y se usa cuando el sistema es de un solo usuario.

Cifrar con contraseña

Cifrar un archivo en PHP usando una contraseña es más fácil que encriptar un archivo usando la clave.

Ahora se invoca al método encryptFileWithPassword cuyo uso se ve en el siguiente código:

Pueden ocurrir excepciones, aunque el manejo de las mismas es opcional.

Como ves, encryptFileWithPassword toma la ruta del archivo original, lo cifra usando la contraseña y finalmente el contenido lo escribe en la ruta del archivo de salida.

Descifrar con contraseña

Para terminar el post veamos cómo descifrar o desencriptar un archivo con PHP usando una contraseña.

Recuerda que la misma contraseña que se utilizó para cifrar el contenido del archivo debe usarse para este proceso.

El código es el siguiente:

Ahora el método es decryptFileWithPassword, el cual toma la ruta del archivo encriptado, la ruta en donde va a poner el archivo descifrado y la contraseña.

Conclusiones

Como lo dije en los ejemplos, después de cifrar o descifrar los archivos con PHP puedes eliminarlos usando la función unlink.

Por cierto, a los archivos les he puesto la extensión .cifrado para reconocerlos, pero el nombre puede ser cualquiera.

Los archivos que puedes cifrar con php-encryption son ilimitados, es decir, no hay una lista de extensiones o tipos.

Eso sí, recuerda que entre más grande sea el archivo, el proceso de cifrado y descifrado con PHP será más lento.

Nota: puedes ver el código en GitHub; los archivos de JavaScript e imágenes son para ilustrar el cifrado, no tienen nada que ver con este código.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *