Я пытаюсь загрузить загруженное изображение, зашифровать изображение, сохранить его в MySQL, а затем расшифровать его для отображения, когда уполномоченное лицо просит его увидеть.
Вот как я сейчас шифрую:
$image = addslashes(file_get_contents($_FILES['users_image']['tmp_name'])); $enc_image = encrypt($image, "long secret random key");
Затем я храню $enc_image
в поле BLOB MySQL. Когда я пытаюсь расшифровать его и распечатать, он выглядит так:
$img = decrypt($rec['file'], "long secret random key"); echo '<img src="data:image/jpeg;base64,'.base64_encode($img).'"/>';
Я использую этот код из этого ответа Stackoverflow , и я вижу расшифрованный текст base-64 в моем выпуске, но он не отображается через HTML. Вот пример попытки зашифрованного образа восстановить: https://pastebin.com/miDCP3Gz
ПРИМЕЧАНИЕ. Мой «длинный секретный случайный ключ» включает хешированную случайную уникальную соль, но я уверен, что я шифрую и дешифруя с той же строкой.
Любая идея, почему это не будет отображаться правильно?
1) Убедитесь, что ваше изображение достаточно мало или ваше место хранения достаточно велико. Если у вас есть что-то более 65 КБ, вам нужен длинный блок, а не капля. Все, что над этим размером будет усечено и потеряно.
2) Переместите добавочные знаки справа перед вставкой в БД, а не перед шифрованием. Одиночные кавычки (или двойные в зависимости от того, что вы используете) обозначают начало и конец строки для двигателя MySQL. Функция addslashes ускользает от этих и других специальных символов, чтобы они не путали их механизм MySQL. Тот факт, что он добавляет запись в БД, когда вы выполняете ее до того, как шифрование является просто случайным.
3) Вы должны знать, что эти изображения сохраняются на сервере в качестве временных файлов. Если не будут приняты специальные меры предосторожности, данные в них останутся в недоступном месте на жестком диске. Он может быть легко извлечен противником, используя средства судебной экспертизы или восстановления.
<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>
Удалите добавочные шары в фазе шифрования.