【问题标题】:Using AES Encryption for sensitive data in MYSQL - Implementation Questions在 MYSQL 中对敏感数据使用 AES 加密 - 实施问题
【发布时间】:2016-12-19 10:46:01
【问题描述】:

有许多问题讨论了使用加密在 MYSQL 中存储敏感信息。有些人对加强 Web 服务器、数据库服务器和 Web 应用程序提出了很好的建议 (Store 'sensitive' data in MySQL DB)。然而,除了一些涉及使用技术问题的问题(How to use AES_ENCRYPT and AES_DECRYPT in mysql)之外,很少有人讨论 MYSQL 的 AES_Encrypt 和 AES_Decrypt 功能的确切实现。

我正在使用下面的 MYSQL 准备语句来加密敏感信息:

$stmt = $db->prepare("INSERT INTO Table_Name (SensitiveData) VALUES (AES_ENCRYPT(?,UNHEX(SHA2('RandomStringofData',512))))");
$stmt->bind_param('s',$SensitiveData);
$stmt->execute();
$stmt->close();

我在需要时使用具有相同 SHA2 字符串的 AES_DECRYPT 函数来解密数据。我理解这一点的方式是,没有人访问 Web 服务器本身或弄清楚 SHA2 密码,他们无法轻松访问这些敏感数据。例如,获得数据库服务器访问权限的人不会帮助他们解释这些敏感数据。

我有几个问题:

  1. 我在这里读到了初始化向量:http://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html。我不太明白这是如何工作的,或者它是否应该实施。什么是初始化向量,它能否帮助提高我上面使用的加密方法的安全性?
  2. SHA2 密码短语在加密和解密此数据的文件中采用纯文本格式,这让我感到不舒服。是否有其他方法可以对此进行编码,使其位于公共目录之外的文件中?
  3. 该系统的一个缺陷是,如果有人劫持了 Web 应用程序,他们仍然可以通过运行解密信息的脚本来访问这些敏感数据。虽然我有强大的访问控制,但如果这也被规避,我正在研究一种数据可能会受到损害的情况。我已经实施了 SSL 预防措施和此链接中推荐的其他措施:How can I store sensitive data securely in a MySQL database?。我还查看了此链接中的建议:How do you Encrypt and Decrypt a PHP String?。有没有办法解密这些数据以供其他应用程序使用,或者将其视为密码并仅比较散列值以确保它们相等是否更安全?
  4. 我的最后一个问题与开销有关。这是一个巨大的数据库,大小为数 GB,具有数百万行和数百列。我只加密了这个数据库中的几个字段,它们不被用作索引。我真正看到了这样的性能影响有多大?

谢谢。

【问题讨论】:

    标签: mysql security encryption cryptography aes


    【解决方案1】:

    不要使用AES_ENCRYPT() 来保证数据安全。如果您的应用程序包含必须加密存储的敏感数据,您应该在应用程序中实现加密和解密(即在 PHP 代码中)。

    AES_ENCRYPT() 有几个主要问题:

    • 加密密钥被传输到 MySQL 服务器。在查询运行时,SHOW PROCESSLIST 中的其他客户端将可以看到它。此外,如果启用了常规日志或慢查询日志记录,则可能会将密钥写入这些日志。

    • 1234563
    • 很多常用的 MySQL 版本(低于 5.7.4)只支持 ECB 模式。 ECB is insecure.

    在 PHP 中实现加密时,不要使用 mcrypt。它有缺陷,无人维护,并且在 PHP 7.1 中已被弃用(并且可能会在以后的版本中完全删除)。理想情况下,您应该使用尽可能多地封装加密的库(如libsodium);如果做不到这一点,请使用 OpenSSL 扩展中可用的加密原语。

    【讨论】:

    • 这有助于澄清一些事情,也提出了一些其他问题。通过在应用程序中加密/解密,您的意思是在 PHP 代码本身中运行加密并将加密值保存到数据库中吗?我没有使用 ECB 或 mcrypt,但听起来 libsodium 可能是一个可能的解决方案。那么如果我在应用程序中进行加密/解密,我还需要 libsodium 吗?
    • 1) 是的。数据库应该只处理存储和检索数据。加密应该在 PHP 代码中。 2) libsodium 是您应该在应用程序中执行加密/解密的方式。避免直接使用加密原语。
    猜你喜欢
    • 2012-07-12
    • 2021-04-10
    • 2012-08-11
    • 2013-03-24
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多