2017-09-25 1 views
0

Ich versuche, ein hochgeladenes Bild zu nehmen, das Bild zu verschlüsseln, speichern Sie es in MySQL, entschlüsseln Sie es für die Anzeige, wenn eine autorisierte Person anfordert, es zu sehen.Mit PHP zu verschlüsseln Bild für die Speicherung in MySQL BLOB dann entschlüsseln und drucken

Hier ist, wie ich zur Zeit Verschlüsselung:

$image = addslashes(file_get_contents($_FILES['users_image']['tmp_name'])); 
$enc_image = encrypt($image, "long secret random key"); 

Dann speichere ich die $enc_image in einem MySQL-BLOB-Feld. Wenn ich versuche, es zu entschlüsseln und drucken geht in etwa so:

$img = decrypt($rec['file'], "long secret random key"); 
echo '<img src="data:image/jpeg;base64,'.base64_encode($img).'"/>'; 

Ich verwende diesen Code aus this Stackoverflow answer, und ich bin mit dem entschlüsselten Base64-Text zu sehen, in meiner Ausgabe, aber es funktioniert nicht Anzeige über HTML. Hier ist ein Beispiel für einen verschlüsselten Bildversuch: https://pastebin.com/miDCP3Gz

HINWEIS: Mein "langer geheimer Zufallsschlüssel" enthält eine zufällige zufällige Hash-Hash, aber ich bin sicher, dass ich mit der gleichen Zeichenfolge verschlüsseln und entschlüsseln.

Eine Idee, warum dies nicht korrekt angezeigt würde?

Antwort

1

1) Stellen Sie sicher, dass Ihr Image klein genug ist oder dass Ihr Speicherort groß genug ist. Wenn Sie etwas über 65kB haben, brauchen Sie einen Longblob, keinen Blob. Alles über diese Größe wird abgeschnitten und verloren.

2) Verschieben Sie die addslashes nach rechts vor dem Einfügen in die DB, NICHT vor der Verschlüsselung. Einfache Anführungszeichen (oder doppelte, je nachdem, welche Sie verwenden) bestimmen Anfang und Ende einer Zeichenfolge für die MySQL-Engine. Die addslashes-Funktion vermeidet diese und andere Sonderzeichen, um zu verhindern, dass sie die MySQL-Engine verwirren. Die Tatsache, dass der Datensatz der Datenbank hinzugefügt wird, wenn Sie ihn vor der Verschlüsselung ausführen, ist lediglich zufällig.

3) Sie sollten wissen, dass diese Bilder auf dem Server als temporäre Dateien gespeichert werden. Wenn keine besonderen Vorsichtsmaßnahmen getroffen werden, bleiben die darin enthaltenen Daten im freien Speicherplatz auf der Festplatte. Es kann leicht von einem Gegner mit Forensik oder Restaurierung Tools abgerufen werden.

<html> 
<head><title>Picture</title></head> 
<body> 
    <form enctype="multipart/form-data" action="file.php" method="post"> 
     <input type="hidden" name="MAX_FILE_SIZE" value="600000" /> 
     <input type="file" name="users_image"/> 
     <input type="submit" text="Upload"> 
    </form> 
<? 

    if($_SERVER['REQUEST_METHOD'] === 'POST') 
    { 

     $image = file_get_contents($_FILES['users_image']['tmp_name']); 
     //encrypt 
     $cipher = "aes-128-cbc"; 
     $ivlen = openssl_cipher_iv_length($cipher); 
     $iv = openssl_random_pseudo_bytes($ivlen); 
     $key = openssl_random_pseudo_bytes(128); 
     $ciphertext = openssl_encrypt($image, $cipher, $key, $options=0, $iv); 

     //add to DB 
     $mysqli = mysqli_connect("localhost","testu","","test"); 
     $query = "INSERT INTO blobtbl(pics) VALUES (\"" . addslashes($ciphertext) ."\")"; 
     $mysqli->query($query); 
     $id = mysqli_insert_id($mysqli); 

     //retireve from DB 
     $sql = "SELECT * FROM blobtbl WHERE id = $id"; 
     $res = $mysqli->query($sql); 
     $row=mysqli_fetch_assoc($res); 
     $newciphertext = $row['pics']; 

     //decrpyt and display 
     $img = openssl_decrypt($newciphertext, $cipher, $key, $options=0, $iv); 
     echo '<img src="data:image/jpeg;base64,'.base64_encode($img).'"/>'; 
     echo "<br>Did it work?"; 
    } 
?> 
</body> 
</html> 
0

Entfernen Sie addslashes in der Verschlüsselungsphase.

+0

Wenn ich das entferne, fügt es nicht einmal richtig in die Datenbank ein. – Bing

+0

Was ist das Apache-Fehlerprotokoll oder BD-Fehlerprotokoll? Was ist Ihre Verschlüsselungsbibliothek oder -methode? –

Verwandte Themen