Può funzionare per far crittografare i file degli utenti in modo che solo l'utente possa decodificare e visualizzare i file?

0

Voglio creare una sorta di archivio di file. Voglio archiviare i file crittografati in una tabella MySQL e la chiave per crittografarli / decodificarli non viene mai archiviata, ma solo nota all'utente (che è comunque l'obiettivo).

L'utente deve essere registrato per visualizzare un elenco dei suoi file. Quindi, per visualizzare un file, l'utente deve inserire una chiave per decodificare un file per leggerlo. Quindi supponendo che l'account di un utente sia stato violato e che la sua password sia stata scoperta, voglio che l'hacker non sia ancora in grado di decifrare i file, dal momento che l'hacker non conosce la chiave utilizzata per crittografarlo.

Quali sono i maggiori buchi in questo? Per favore aiutami a migliorarlo invece di dire 'questo è terribile'. So che la sicurezza di questo dipende da un altro codice che non ho messo qui. Ho solo provato a mettere le parti più rilevanti.

Ecco un codice dal controller per aggiungere un nuovo file:

    public function addFile($request, $response) {

        $user = Security::getUser();
        if (!$user) { $this->denyAccess('add-file'); }

        $unencrypted_content = $request->getParam('content');
        $key = $request->getParam('key');
        if (Security::authenticate($user->username, $key)) {
            $this->flash->addMessage('error', 'You can not use your password as the key to your files.');
            return $this->redirect('new-file');
        }

        $otherFile = $user->files()->first();
        if ($otherFile && !Crypt::decrypt($otherFile->content, $key, $otherFile->iv)) {
            $this->flash->addMessage('error', 'The key you entered failed to decrypt another one of your files. You must always use the same key.');
            return $this->redirect('new-file');
        }

        $iv = Crypt::iv();
        $encrypted_content = Crypt::encrypt($unencrypted_content, $key, $iv);

        $file = new File;
        $file->owner()->associate($user);
        $file->name = $request->getParam('name');
        $file->content = $encrypted_content;
        $file->iv = $iv;
        $file->save();

        return $this->redirect('all-files');
    }

Ecco la classe Crypt:

public static function iv() {
    $letters = 'abcdefghijklmnopqrstuvwxyz0123456789';
    $iv = '';

    for ($i = 0; $i < 16; $i++) {
        $iv .= substr($letters, rand(0, 35), 1);
    }

    return $iv;
}

public static function encrypt($content, $key, $iv) {
    return openssl_encrypt($content, 'aes-256-cbc', $key, 0, $iv);
}

public static function decrypt($content, $key, $iv) {
    return openssl_decrypt($content, 'aes-256-cbc', $key, 0, $iv);
}

E di nuovo nel controller per visualizzare un file:

public function viewFile($request, $response) {
        $csrf_name = $request->getAttribute('csrf_name');
        $csrf_value = $request->getAttribute('csrf_value');

        $file = File::find($request->getAttribute('id'));
        if ($file->owner->id !== Security::getUser()->id) { $this->denyAccess('view-file/' . $file->id); }

        $key = $request->getParam('key');
        $decrypted_content = Crypt::decrypt($file->content, $key, $file->iv);

        if (!$decrypted_content) {
            $this->flash->addMessage('error', 'The key you entered is not valid.');
            return $this->redirect('authorize', ['id' => $file->id]);
        }

        $file->content = $decrypted_content;
        $file->key = $key;

        return $this->render($response, 'file/view.html.twig', compact('file', 'csrf_value', 'csrf_name'));
    }
    
posta twharmon 02.11.2016 - 22:32
fonte

0 risposte

Leggi altre domande sui tag