Php数据库 - 内容加密/解密

时间:2017-09-18 13:54:06

标签: php mysql database security encryption

Greetings Stack Overflow社区,

我正在开发一个将数据输入数据库的网站,而且数据本身相当敏感。作为预防措施,我想要进行一些加密/解密,虽然我在一些基本测试中取得了成功,但当我尝试从数据库本身提取数据时,它目前无法正常工作。

这是我目前的工作;

$plaintext      = 'Hello World';

$encrypted      = openssl_encrypt($plaintext, $cipher, $key, 0, $iv);

$decrypted      = openssl_decrypt($encrypted, $cipher, $key, 0, $iv);

echo "<pre>" . $encrypted . " - Encrypted Version </pre>";
echo "<pre>" . $decrypted . " - Decrypted Version </pre>";

这可以在页面本身(Image)上正常工作,如此图片所示。当尝试将其输入数据库并检索它并解密时,它会停止工作。

我可以看到数据库中的数据是加密的,我可以正常回显结果,但是,当我尝试使用mysqli_fetch_array()循环并检索数据时,相同的功能只能工作以上,不再有效..

while($row = mysqli_fetch_array($result))
{

    $title = openssl_decrypt($row['title'], $cipher, $key, 0, $iv);

    echo "<pre>" . $title . " - Decrypted Version (MySQLi) </pre>";

}

请注意,循环数据库的连接正常,因为我可以输出原始数据本身。它只是通过openssl_decrypt它不再有效。

我为什么原因感到困惑,我已经查看了大量的Stack Overflow问题以及许多其他在线资源,但没有一个与我的问题有关。

感谢您花时间阅读,并期待着解决这个问题。

其他信息

Php版本:7.1.9 MySQL版本:5.7.14 Apache版本:2.4.23

1 个答案:

答案 0 :(得分:1)

您可能会对the supplementary material在2017年安全B-Sides奥兰多的演讲中感兴趣,该演讲名为构建针对奇怪问题的可防御解决方案,其中包含可搜索的加密数据库< / em>作为一个奇怪的问题。它具有完整功能的演示代码。

我写了searchable encryption in PHP的推荐信。

我们还在名为CipherSweet的库中实现了此设计。

第一个问题:你使用的是什么密码模式,到处都是一样的?

例如,如果您使用AES-256-CBC加密然后解密AES-128-ECB,则在尝试解密时,您将获得填充错误。

  

建议:使用像defuse/php-encryption这样的库,它将所有这些细节抽象出去,并确保它们的OpenSSL接口一致使用。

第二个问题:你如何在MySQL中存储这些数据,并且列截断是问题所在?如果您尝试在varchar(30)列中存储32个字符,则无法成功解密结果。我看到你正在使用base64,这避免了我的第三个问题(字符编码错误)。

对于没有专门的加密专家来说,加密实际上非常困难,这就是专家编写并由其他专家审查的加密库存在的原因。当然,it's perfectly fine to tinker for the sake of learning