问候 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
最佳答案
您可能对 the supplementary material 感兴趣我在 2017 年奥兰多 Security B-Sides 大会上的一次演讲,题目是为奇怪的问题构建可防御的解决方案,其中将可搜索的加密数据库作为奇怪的问题之一。它包含功能齐全的演示代码。
我已经为 searchable encryption in PHP 写下了我的建议.
我们还在一个名为 CipherSweet 的库中实现了这个设计。 .
第一个问题:你用的是什么加密模式,各地都一样吗?
例如,如果您使用 AES-256-CBC 进行加密,然后使用 AES-128-ECB 进行解密,您将在尝试解密时遇到填充错误。
Recommendation: Use a library like defuse/php-encryption, which abstracts all of these details away and ensures they OpenSSL interface is being used consistently.
第二个问题:您如何将这些数据存储在 MySQL 中,列截断是问题所在吗?如果您尝试在 varchar(30) 列中存储 32 个字符,您将无法成功解密结果。我看到您使用的是 base64,这避免了我的第三个问题(字符编码错误)。
实际上,对于不是专门的密码学专家的任何人来说,加密都非常困难,这就是为什么存在由专家编写并由其他专家审查的密码学库的原因。当然,it's perfectly fine to tinker for the sake of learning .
关于Php数据库-内容加密/解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46281075/