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
答案 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。