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

标签 php mysql database security encryption

问候 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/

相关文章:

php - 从mysql获取数据并绘制图表

php - 如何将 mySQL 的输出查询放入 php int 变量

php - 无法正确选择数据

mysql - SQL 将具有相同值的行删除到新表中

php - 如何获取字符串数组的两个连续值的值

mysql - 锁是否通过复制传播?

mysql - 简单的更新查询需要很长时间才能在 MySQL 中执行

mysql - 将用户事件编号存储在数据库中

ios - 核心数据文件的名称/位置在哪里?

ruby-on-rails - 将外部数据库连接到 Rails 4 App 时出错