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