我不确定使用 MySQL 内置加密是否是解决您问题的最佳方法。
PHP 的M_CRYPT包被认为非常好,它使您可以灵活地选择最适合您需要的算法。
将您的密钥存储在其他服务器上有一个很大的优势:密钥与加密数据不在同一台机器上*)。因此,只要攻击者对受感染的机器没有足够的控制权,他们就无法获得密钥。
如果攻击者完全控制了存储数据的机器,他们很可能能够向 Web 服务查询密钥。
但是,将密钥从一台机器传输到另一台机器会打开一个需要保护的全新区域。可能涉及更多的密钥和更多的加密层,从而增加了出错的机会。
*)另一种选择是在网络服务器启动时输入密码并仅将其保存在内存中。
可能
的解决方案如果看到使用以下方法为具有 Web 访问权限的用户加密文件的解决方案(我不确定您的环境,但它可能会有所帮助):
- 在创建用户时,会为新用户分配一个长随机密钥。
- 此随机密钥存储在用户记录的加密列中。
(仅此列被加密,不影响其余记录的性能!)
- 随机密钥列的加密是使用 1 个主密码完成的,存储在文件或内存中。
(更好的选择是在启动您的网络服务器时输入密码并将其仅存储在内存中。)
(另一种方法是让用户输入密码并使用它来加密/解密随机密钥列,但我不确定这是否会增加或降低安全性)
- 每个需要加密的文档都使用该用户的随机密钥加密,然后存储在磁盘上。
- 文档以最小权限存储在文件系统中。
The advantages of this approach are:
1. The random-key is encrypted in the database. So you still have the added security of the database-server, in combination with the encrypted column.
2. Documents are stored with different keys, if the attacker gets hold of a key, only part of the documents is compromised.
However:
If the attacker gets hold of the master password and has read access to the user-table, the entire system is, once more, broken.