2017-09-25 2 views
0

J'essaie de prendre une image téléchargée, de crypter l'image, de la stocker dans MySQL, puis de la déchiffrer pour l'afficher lorsqu'une personne autorisée demande à la voir.Utiliser PHP pour crypter l'image pour le stocker dans MySQL BLOB puis décrypter et imprimer

Voilà comment je chiffrer actuellement:

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

Puis-je conserver le $enc_image dans un champ BLOB MySQL. Lorsque je tente de le déchiffrer et l'imprimer va comme ceci:

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

J'utilise ce code de this Stackoverflow answer, et je vois le texte de base 64 décryptée, dans ma sortie, mais il n'a pas afficher via HTML. REMARQUE: Ma "clé aléatoire longue" comprend un sel aléatoire aléatoire haché, mais je suis sûr que je suis en train de crypter et de décrypter avec la même chaîne de caractères.

Une idée de ce que cela ne serait pas affiché correctement?

Répondre

1

1) Assurez-vous que votre image est suffisamment petite ou que votre emplacement de stockage est assez grand. Si vous avez quelque chose de plus de 65ko, vous avez besoin d'un longblob et non d'un blob. Tout ce qui dépasse cette taille sera tronqué et perdu.

2) Déplacez les addslashes vers la droite avant l'insertion dans la BD, PAS avant le chiffrement. Les guillemets simples (ou doubles selon que vous utilisez) désignent le début et la fin d'une chaîne au moteur MySQL. La fonction addslashes échappe à ceux-ci et à d'autres caractères spéciaux pour les empêcher de confondre le moteur MySQL. Le fait qu'il ajoute l'enregistrement à la base de données avec vous l'exécutant avant le cryptage est simplement aléatoire.

3) Vous devez savoir que ces images sont sauvegardées sur le serveur en tant que fichiers temporaires. À moins que des précautions spéciales ne soient prises, les données qui s'y trouvent resteront dans l'espace libre du disque dur. Il peut facilement être récupéré par un adversaire en utilisant des outils médico-légaux ou de restauration.

<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

Suppression de addslashes dans la phase de cryptage.

+0

Lorsque je l'enlève, il ne s'introduit même pas correctement dans la base de données. – Bing

+0

Qu'est-ce que le journal des erreurs Apache ou le journal des erreurs BD? Quelle est votre bibliothèque ou méthode de cryptage? –