【问题标题】:Mysql encryption / storing sensitive data,Mysql加密/存储敏感数据,
【发布时间】:2021-04-10 06:31:19
【问题描述】:

我为我的 PHP 网站准备了以下内容:

  • 启用 SSL
  • Cookie:

    session_set_cookie_params($cookieParams["lifetime"], 
    $cookieParams["path"], $cookieParams["domain"], $secure, $httponly);
    
  • 传输时的密码 SHA512,然后是 password_hash(),最后是 PASSWORD_BCRYPT

  • Mysqli 准备好的语句
  • INSERTING/UPDATE 到 Mysql 时所有输入都经过清理
  • htmlentities 等。用于尽可能避免 xss。

我现在正在寻找使用 AES_Encrypt 函数来加密敏感数据,方法是将 $key 加密和解密存储在 webroot 目录之外。

这可能会存储患者数据,我所拥有的是否足够安全?


问题:

在 INSERT/UPDATE 时如何清理输入?如果您使用的是准备好的语句,您也不应该手动转义数据。

答案:
示例:

  $firstname = ucwords(filter_input(INPUT_POST, 'firstname', FILTER_SANITIZE_STRING));

【问题讨论】:

  • 在 INSERT/UPDATE 时如何清理输入?如果你使用的是准备好的语句,你也不应该手动转义数据。
  • 关于加密,你应该使用一些久经考验的库,比如defuse/php-encryption
  • 处理密码时,您是使用自己的哈希和盐还是使用password_hash()password_verify()
  • 是的,我正在使用 password_hash() / password_verify()
  • 最后的建议是不要在 password_hash 中使用默认基线 cost 参数 (10) 并使用更高的值,具体取决于服务器处理器的能力。通常目标值是 12-15。它使您的哈希值更加安全。

标签: php mysql security encryption


【解决方案1】:

我一直理解 不使用 MySQL 的内置加密功能,因为静态数据加密的要点(在 SQL 中)是,如果服务器受到破坏,数据不在 [一样多]风险。

MySQL 内置功能的问题在于,它不适用于数据在“at rest”状态下传入和传出的时间,因此可以记录任何数据的明文在 MySQL 日志(以及存储系统上的其他地方,例如查询查找未加密,因此您可以从大量查找及其count 结果推断列值)在加密之前/之后。 You can read more about this here.

关于加密,您应该使用一些久经考验的库,例如defuse/php-encryption

根据我在自己对该主题的研究中所读到的内容,Magnus 提供的指向defuse/php-encryption 的链接是防止 MySQL 导致您破坏数据的最佳方法之一,永远不要让 MySQL 程序/服务器曾经看到你的数据的明文值。

【讨论】:

    【解决方案2】:

    +1 对 Martin 的回答,但我会添加一些信息来说明它的价值。

    MySQL 5.7 已为 InnoDB 表空间 (https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace-encryption.html) 实施静态加密。

    据报道,MySQL 8.0 还将对 InnoDB 重做日志和撤消日志文件实施静态加密 (https://dev.mysql.com/doc/refman/8.0/en/innodb-data-encryption.html)。

    这仍然会留下未加密的查询日志和二进制日志。为此,我们将不得不等待 MySQL 的某个未来版本。

    为什么需要这么长时间? MySQL 安全工程负责人上个月在 Percona Live 会议上的一次鸟语会议上表示,他们在实施加密方面非常小心正确。这意味着实现加密功能,以及密钥安全性和密钥轮换以及其他用途。做到这一点非常复杂,而且他们不想实现一些会被弃用并使每个人的加密数据库无效的东西。

    【讨论】:

    • 谢谢比尔。正如我所说,我认为如果在 PHP/抽象层而不是在 SQL 本身中进行加密,那么泄漏的可能性就会大大降低(并且数据更加整洁)。特别是。如果它们是不同的服务器,并且密钥存储在 PHP 服务器上,而数据存储在 MySQL 服务器上,这也意味着攻击 [可能] 需要破坏两台服务器才能获取数据......
    • v8.0.14 为二进制日志添加了加密:dev.mysql.com/doc/refman/8.0/en/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2021-03-27
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多