PHP: descifrar un archivo directamente a una secuencia usando la biblioteca de desactivación / PHP_encryption

0

He estado usando por un tiempo la excelente Defuse PHP Encryption para almacenar cadenas de datos encriptados en una base de datos.

Tengo una extensión de esta necesidad donde ahora tengo archivos que necesitan ser cargados y protegidos en reposo. Estos archivos no suelen ser más grandes que los documentos de 500Kb.

He estado buscando en Defuse / PHP Encryption File y el sistema parece funcionar perfectamente para guardar archivos recién cargados.

Sin embargo, estoy explorando el mejor método para abrir estos archivos cifrados. La clase Defuse\Crypto\File obviamente puede descifrar los archivos, pero parece que solo puede descifrarlos a otro, archivo de texto simple .

¿Es posible descifrar el archivo y enviarlo solo a una cadena?

Si, por ejemplo, alguien abre un archivo encriptado, se descifra entonces durante el tiempo que se encuentre en esa página (el contenido del archivo se verá / descargará a través de una página intermedia de PHP, por lo que la ubicación del archivo nunca se presentará al usuario). usuario) el archivo de texto sin formato estaría ubicado en el servidor y potencialmente accesible para cualquiera que pueda acceder a él.

Con esto en mente, tengo algunas consultas:

  • ¿Existe alguna posibilidad de que, al utilizar Desactivar el cifrado PHP , un archivo cifrado se pueda descifrar a una secuencia / cadena (PHP), así que evite un archivo de texto simple en el servidor por cualquier cantidad de tiempo?

  • He (solo) considerado un método para guardar un archivo de texto simple en el servidor, luego usar file_get_contents y luego unlink ing el archivo de texto simple. (Este es mi enfoque preferido en este momento, pero solo lo pensé mientras escribía esta pregunta)

    • En los servidores Linux, creo que sería preferible sobrescribir los datos archivados, como por ejemplo con random_bytes antes unlink ing del archivo de texto sin formato. ¿Es esto correcto?

      Mis pensamientos sobre esto provienen de la función de desvinculación, solo elimina el enlace al archivo y, por lo tanto, (potencialmente) el archivo aún puede existir en la práctica (aunque sea más difícil de alcanzar) hasta que el disco local realice su limpieza habitual.

  • ¿Existe alguna ventaja, como concepto, de cargar los datos del archivo de texto sin formato desde la carga y el cifrado de la cadena de datos con Defuse\Crypto\Crypto y luego guardar este Crypto de datos cifrados blob en el archivo de almacenamiento?

Enlaces de investigación

He leído github para la biblioteca, y también leí los problemas y los comentarios relacionados con el descifrado de archivos en secuencias, pero estos problemas / comentarios se enfrentan más sobre el tamaño excesivo de los archivos (y el hecho de que todo el archivo debe leerse). Estos no se aplicarán en mi caso.

También he leído una publicación principal de la página de manual de PHP desvinculación que parece confirmar mis pensamientos en unlink .

    
pregunta Martin 22.07.2016 - 17:44
fuente

1 respuesta

1

Probé el cifrado con la clase File , luego leí el contenido del archivo y lo descifre con Crypto::decrypt() , sin embargo, no son compatibles de fábrica.

Así que terminé escribiendo una pequeña clase de envoltorio en la línea de su tercera idea: leer el archivo simple, cifrar la cadena y escribir los datos cifrados en el disco. Incluye esta función (tenga en cuenta que $this->key() se carga / desbloquea en otra parte de la clase):

use Defuse\Crypto\Exception as Ex;
use Defuse\Crypto\Crypto;

public function encrypt_file($source, $destination, $password = "") {
    try {
        if(is_file($source) === true) {
            $string = file_get_contents($source);

            if($password == "") {                   // Key object-based encryption
                if(file_put_contents($destination, Crypto::encrypt($string, $this->key), LOCK_EX) !== false)
                    return true;
            }
            else {                                  // password-based encryption
                if(file_put_contents($destination, Crypto::encryptWithPassword($string, $password), LOCK_EX) !== false)
                    return true;
            }
        }

        return false; 
    }
    catch(Ex\EnvironmentIsBrokenException $e) {
        return false;
    }
}

Ahora puedo leerlo con file_get_centents() y Crypto::decrypt() , y es fácil volcar el archivo simple de nuevo en el disco si realmente quiero (lo que generalmente no hago).

    
respondido por el Kyrth 20.12.2016 - 17:18
fuente

Lea otras preguntas en las etiquetas