Estoy creando una aplicación PHP que permite cargar archivos (.doc / pdf, etc.) para que un miembro del personal los revise. Algunos de estos archivos serán algo confidenciales, por lo que debo protegerlos.
Ahora, la mejor solución sería lograr que el remitente cifre estos archivos con GPG o similar antes de cargarlos y descifrarlos con una clave previamente compartida en el otro extremo (en la computadora del personal, no en el servidor web). / p>
Sin embargo, no es realista esperar que todos los clientes instalen y aprendan a usar GPG para cargar archivos.
Así que la mejor solución que puedo encontrar es:
1) Realice cargas de archivos a través de HTTPS en una página protegida por contraseña.
2) Cifre archivos utilizando GPG asimétrico y un archivo de clave pública almacenado en el servidor web.
3) Borre todas las copias no cifradas del archivo en / tmp etc.
4) Envíe un correo electrónico al personal para notificarles que el archivo está disponible para descargar.
5) El miembro del personal inicia sesión y descarga el archivo, el servidor luego borra la copia encriptada.
6) El miembro del personal luego desencripta el archivo usando su clave privada que no está almacenada en el servidor web.
La idea aquí es que siempre que el servidor web esté comprometido (es un servidor dedicado, por lo que no se comparte con otros), el atacante no podrá descifrar estos archivos porque no encontrarán la clave allí.
Sin embargo: creo que esto todavía es vulnerable.
Porque, si un atacante tiene una raíz o solo el control del usuario del servidor HTTP, podrá leer los datos de / tmp mientras el archivo todavía se está cargando / encriptando y hacer una copia sin cifrar que podrá descargar más tarde.
Entonces, ¿quizás podría hacer todo esto en la memoria sin escribir en / tmp? Pero todavía existe el riesgo de que el atacante pueda descubrir las direcciones de memoria en las que se escriben los datos cargando un archivo ellos mismos y luego usar ptrace. para inspeccionar y copiar esas direcciones de memoria.
No puedo pensar en una forma de solucionar este problema, ya que necesitaré los datos en texto sin formato para realizar el cifrado. ¿Hay alguna forma en PHP para hacer que la inspección de memoria sea más difícil? ¿O hay un servicio web de terceros que sería mejor utilizar para esto?