【问题标题】:Php Database - Content Encryption / DecryptionPHP 数据库 - 内容加密/解密
【发布时间】:2018-02-27 02:18:10
【问题描述】:

问候 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 阿帕奇版本:2.4.23

【问题讨论】:

  • 可能是编码问题?请验证您在执行 SELECT 时得到的结果与您之前在表中插入的内容完全相同,如有必要,请使用校验和(例如 MD5)。
  • 谢谢@Chris - 对不起,那是我的错误。这没有在数据输入中使用,我已经从输出中删除了它,它仍然无法正常工作。我写的时候只是在测试,忘了省略它。
  • openssl_decrypt 函数没有理由无法解密使用openssl_encrypt 和相同参数正确加密的内容。我将首先启用errors reporting 并检查错误日志。 openssl_decrypt 函数在与错误参数一起使用时返回 false,因此您可能会得到一个空字符串 (Boolean FALSE is converted to "" (the empty string),并且您应该会看到相应的警告。
  • 很难说。该函数返回false,因为某处存在错误(加密值?另一个参数?...)。我知道我的评论没有帮助,但再次重申,没有看到完整的示例和/或错误日志,显然不可能说,抱歉。
  • 能否请您显示在表格中加密并插入标题的代码,以及SHOW CREATE TABLE &lt;your_table_name_here&gt;的完整输出?

标签: php mysql database security encryption


【解决方案1】:

您可能对 the supplementary material 感兴趣,因为我在 Security B-Sides Orlando 2017 上进行了题为为奇怪问题构建防御性解决方案的演讲,其中涵盖了可搜索的加密数据库 作为奇怪的问题之一。它包含功能齐全的演示代码。

我已经为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

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 2013-08-04
    • 2011-11-20
    • 1970-01-01
    • 2012-06-19
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多