CentOS 5 – GPG y PHP

Una manera rápida y fácil de encriptar archivos con GnuGPG. Básicamente, se trata de generar un archivo .gpg mediante un script de php.

En consola, la generación del archivo sin hacer uso de la llave, añadiendo un password ocasional por la entrada estándar sería así

# echo unpassword| gpg -c --passphrase-fd=0 archivo

En contra, para desencriptarlo sería

# echo unpassword | gpg –passphrase-fd=0 archivo.gpg

De este modo, hemos encriptado “manualmente” por decirlo así, un archivo utilizando gpg. Ahora, lo interesante sería poder utilizar esto de forma automática o por cron. Dejamos de lado el tema script de sistema y nos centramos en un cron ejecutado con php. En este caso, lo ejecuta el usuario nobody nobody, usuario de Apache en Debian. En otras distros pues sería otro usuario porque la configuración de Apache será diferente.

La principal línea del código sería algo así:


echo shell_exec('echo '.$_POST['password'].' |
/usr/bin/gpg -c --passphrase-fd=0 /home/usuario/archivo');

Le pasamos a shell_exec el password con el que vamos a encriptar la base de datos con $_POST[‘password’]. La otra parte importante es la ruta al archivo a encriptar, /home/usuario/archivo. Antes de ejecutarlo, cosas a tener en cuenta. ¿Quién ejecuta ese script? ¿Php? Lo ejecuta Apache y el usuario como hemos dicho antes es nobody. Por tanto, nobody deberá tener permisos y privilegios para poder acceder a ese archivo en cuestión. Lo ejecutamos. Si ha salido bien, ese día vamos a la administración de lotería más cercana y echamos una primitiva. Si no, miramos los logs de sistema buscando el error.

gpg: fatal: can't create directory `/root/.gnupg': Permission denied

El directorio .gnupg no está creado. Lo creamos. Para hacer las pruebas, le podemos dar permisos totales y luego, restringirlos hasta el nivel más adecuado.


# mkdir /root/.gnupg
# chmod 777 /root/.gnupg

Luego lo cambiamos. Volvemos a ejecutar. Quizá veamos un error como este

gpg: cannot open `/dev/tty': No such device or address

Es un error relacionado con la entrada estándar. El código que estamos ejecutando espera por la entrada estándar, los carácteres que confirmarán el password elegido. Para solucionarlo, modificamos el código de nuestro php añadiendo la opción –batch


echo shell_exec('echo '.$_POST['password'].' |
/usr/bin/gpg -c --passphrase-fd=0 --batch /home/usuario/archivo');

Seguimos repasando los logs de sistema y comprobando si por fin se ha encriptado nuestro archivo.


gpg: can't create `/home/yunuuser/notas.txt.gpg': Permission denied
gpg: symmetric encryption of `/home/yunuuser/notas.txt' failed:
file create error

Si vemos un error como este es que el usuario nobody no puede crear el archivo encriptado en la ruta que le hemos especificado. Cambiamos privilegios y propietario del directorio y volvemos a crear. Al final, deberemos tener nuestro archivo encriptado mediante un password generado manualmente por PHP.

2 thoughts on “CentOS 5 – GPG y PHP

  1. Txumari says:

    Te agradezco este articulo. No sabes tu la de tiempo que llevo buscando como conseguir pasar la contraseña. Lo que si comentar es que a mi no me reconocia tu linea de codigo y era porque me faltaban los dos guiones delantes de passphrase en vez de uno como tu tienes.

    Muchas gracias.

Leave a Reply

Your email address will not be published. Required fields are marked *