php - 使用 PHP 加密图像存储在 MySQL BLOB 中,然后解密并打印

标签 php mysql encryption cryptography blob

我正在尝试获取上传的图像,加密图像,将其存储在 MySQL 中,然后在授权人员请求查看时解密以显示。

这是我目前的加密方式:

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

然后我将 $enc_image 存储在 MySQL BLOB 字段中。当我尝试解密并打印它时,它是这样的:

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

我正在使用来自 this Stackoverflow answer 的代码,并且我在我的输出中看到了解密的 base-64 文本,但它不通过 HTML 显示。以下是尝试恢复的加密图像示例:https://pastebin.com/miDCP3Gz

注意:我的“长 secret 随 secret 钥”包括一个哈希随机唯一盐,但我确信我正在使用相同的字符串进行加密和解密。

知道为什么不能正确显示吗?

最佳答案

  1. 确保您的图像足够小或您的存储位置足够大。如果你有任何超过 65kB 的东西,你需要一个 longblob 而不是一个 blob。超过该大小的任何内容都将被截断和丢失。

  2. 在插入数据库之前将添加斜线移到右边,而不是在加密之前。单引号(或双引号,取决于您使用的引号)指定 MySQL 引擎字符串的开头和结尾。 addslashes 函数对这些和其他特殊字符进行转义,以防止它们混淆 MySQL 引擎。它会在您执行加密之前将记录添加到数据库中这一事实仅仅是随机的机会。

  3. 您应该知道这些图像是作为临时文件保存在服务器上的。除非采取特别的预防措施,否则其中的数据将保留在 HDD 上的空闲空间中。它可以很容易地被对手使用取证或恢复工具检索。

标记:

<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);

        //retrieve 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>

关于php - 使用 PHP 加密图像存储在 MySQL BLOB 中,然后解密并打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46396925/

相关文章:

php - 使用 REGEX 验证带有 GET 参数的域名

php - EasyAppointments 和 Bootstrap 网站之间的共享登录 session

php - 如何显示特定名称的计数?并使用 php sql 显示页面?

java - .NET 和 Java 之间的对称加密

asp.net - 你能用 aspnet_regiis 加密整个 web.config 文件吗?

php - 文件最安全的 chmod

javascript - 如何从 php 到 jquery 获取数组中的数据

php - 将下拉菜单回显到页面上

mysql - 有没有办法在sql中只计算一次重复计算?

ssl - 在 TLS/SSL 中,从 premaster secret 到 master secret 再到加密 key 的目的是什么?