Мне нужно зашифровать файл и сохранить его в mysql как большой двоичный объект, затем расшифровать его и сделать доступным для загрузки. Я сохраняю файл в большом двоичном объекте следующим образом:
$certificate_tmp=$_FILES['certificate']['tmp_name'];
$certificate=openssl_encrypt(file_get_contents($certificate_tmp),$ciphers,$password_tmp);
$wpdb->insert("my_table",array("certificate"=>$certificate));
Примечание. Я вырезал несвязанный код, таблица — это не просто сертификат, но я не хочу, чтобы это запутало.
Это страница загрузки php:
$password_tmp=$_SESSION['pwd']; //decrypt password
global $wpdb; //wordpress db conncetion
$results_file = $wpdb->get_row("select * from my_table where id='$id'",ARRAY_A); //i get the id from wp's curr_user
$m_file = openssl_decrypt($results_file['certificate'],"AES-128-CBC",$password_tmp);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\certificate".$id."\"");
header('Content-Transfer-Encoding: binary');
print_r($m_file);
И с текстовыми файлами все отлично работает, а вот с бинарными файлами результат пустой, хотя в блобе бинарный файл есть.
EDIT Я предполагаю, что как только я расшифрую файл из блоба базы данных, php или html (из-за print_r
) понимает, что это двоичный файл, и не позволяет вам показывать его из-за безопасности причины. Вы не можете запускать программы в Интернете, такие как .exe или .bin, хотя файлы, которые я загружаю, будь то двоичные или текстовые, не имеют расширения. Насколько я понимаю, php обрабатывает двоичные файлы как строки, но file_get_contents
безопасен для двоичных файлов. Я думаю, что лучше всего для этого не использовать BLOB-объекты, но я не могу этого сделать, я должен использовать BLOB-объекты.
EDIT 2 Проблема, похоже, заключается в openssl который, похоже, не любит двоичные данные, я попробовал тот же код, используя mcrypt и работает отлично.