PHP: decifrare un file direttamente su uno stream usando la libreria defuse / PHP_encryption

0

Da un po 'di tempo utilizzo l'eccellente libreria Defuse PHP Encryption per l'archiviazione di stringhe di dati crittografate in un database.

Ho un'estensione di questa esigenza in cui ora ho file che devono essere caricati e protetti a riposo. questi file non sono in genere più grandi di 500Kb di documenti.

Ho esaminato la crittografia Defuse / PHP File class e il sistema sembra funzionare perfettamente per salvare i file appena caricati.

Tuttavia, sto esplorando il metodo migliore per aprire questi file crittografati. La classe Defuse\Crypto\File ovviamente può decrittografare i file ma sembra essere in grado di decrittografarli in un altro file di testo in chiaro .

È possibile decrittografare il file e inviarlo a una stringa solo?

Se ad esempio qualcuno apre un file crittografato, viene decodificato per tutto il tempo che si trova su quella pagina (il contenuto del file verrà visualizzato / scaricato tramite una pagina intermedia di PHP in modo che il percorso del file stesso non venga mai presentato al utente) il file di testo in chiaro sarebbe seduto sul server e potenzialmente accessibile a chiunque possa raggiungerlo.

Con questo in mente ho alcune domande:

  • Esiste la possibilità che - Utilizzando Defuse PHP Encryption - un file crittografato possa essere decriptato su un flusso / stringa (PHP), in modo da evitare un file di testo in chiaro sul server per qualsiasi importo di tempo?

  • Ho (solo) considerato un approccio per salvare un file di testo in chiaro sul server, quindi usando file_get_contents e poi unlink ing il file di testo in chiaro. (Questo è il mio approccio preferito al momento, ma ci ho pensato solo mentre scrivevo questa domanda)

    • Sui server Linux, credo che sarebbe preferenziale sovrascrivere i file come con random_bytes prima di unlink ing il file di testo in chiaro. È corretto?

      Il mio pensiero su questo proviene da un collegamento elimina solo il collegamento al file e quindi (potenzialmente) il file potrebbe ancora esistere nella pratica (anche se più difficile da raggiungere) finché il disco locale non esegue le normali operazioni di pulizia.

  • C'è qualche vantaggio -come un concetto- invece di caricare i dati del file in chiaro dal caricamento e crittografare quella stringa di dati con Defuse\Crypto\Crypto e poi salvare questo Crypto di dati crittografati blob nel file di archiviazione?

Link di ricerca

Ho letto il github per la libreria, e ho anche letto i problemi e i commenti relativi alla decifratura dei file nei flussi ma questi problemi / commenti hanno riguardato di più le dimensioni eccessive dei file (e il fatto che l'intero file deve essere letto). Questi non si applicano nel mio caso.

Ho letto anche un top post dalla pagina di manuale di scollegamento PHP che sembrava confermare i miei pensieri su unlink .

    
posta Martin 22.07.2016 - 17:44
fonte

1 risposta

1

Ho testato la crittografia con la classe File , quindi ho letto il contenuto del file e decodificato con Crypto::decrypt() , tuttavia non sono compatibili fuori dalla scatola.

Così ho finito per scrivere una piccola classe wrapper sulla scia della tua terza idea: leggere il file semplice, crittografare la stringa e scrivere i dati crittografati sul disco. Include questa funzione (nota che $this->key() è caricato / sbloccato altrove nella classe):

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;
    }
}

Ora posso leggerlo con un file_get_centents() e un Crypto::decrypt() , ed è facile scaricare il file normale sul disco se lo voglio davvero (cosa che in genere non lo faccio).

    
risposta data 20.12.2016 - 17:18
fonte

Leggi altre domande sui tag