我已经回答了几个与此相关的 SO 问题,而我的方法在加密数据方面有点不同。这是我想做的..
基本上我所有的客户数据都存储在数据库中,3 周或 4 周后,我真的不再需要他们的数据,例如地址、城市、州、 zip 、电话、电子邮件地址、他们订购的产品等。
现在这些数据以原始格式存储在数据库 (mysql) 中。
我在想的是,在某些天后,我将加密驻留在 mysql 数据库中的所有数据,而不是存储 key ,我将每次通过输入框手动输入它(当想要加密它或者如果由于某种原因解密它只是为了显示在屏幕上)。
所以基本上这就是它的工作原理..
1)在mysql中选择客户的记录
2) 通过输入框获取加密 key
3)通过加密数据更新mysql记录
所以这是我的 2 个问题...
1) 从某种意义上说,如果数据库遭到破坏,数据将得到保护,那么上面提到的是不是一个好的策略。此外,如果入侵者要访问代码,他们将无法访问 key ,因为它不会存储在任何 php 文件中的任何位置。
2) 我应该如何设置加密系统?我应该使用 mysql 的函数 AES_ENCRYPT
(请记住,数据的长度可能会有所不同,例如地址、电子邮件地址或有关客户的一些其他信息)
最佳答案
这个方案听起来很管用。只有一些细节需要您注意。
AES_ENCRYPT
(很好——这也适用于您可能使用的任何其他加密方法)返回一个二进制字符串。您需要将其存储在可以容纳二进制字符串(BINARY
、VARBINARY
、BLOB
变体)的列中,而您可能会存储预非二进制字符串列中的加密信息。因此,您可能需要为加密信息设置另一组列,或者使用一些基于文本的编码,以便能够将加密数据放在用于未加密形式的相同列中。
此外,您应该非常小心您的应用程序逻辑,以免意外地用未加密的数据重新填充加密的行(考虑查看记录 -> 解密 -> 保存更改等场景)。
最后,如果坏人对您的服务器/应用程序具有写入权限,那么他们很可能会拦截加密 key 并保存它。由于所有记录的 key 可能是同一个(出于 key 管理方面的考虑),这足以让他们获取您的所有数据。但如果他们只管理读取访问权限,那你就很好。
关于PHP MySQL - 在不存储 key 的情况下动态加密解密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5446362/