PHP MySQL - 即时加密解密数据而不存储密钥

时间:2011-03-27 00:26:47

标签: php mysql encryption

我已经经历了几个关于此问题的SO问题,我的方法在想要加密数据方面有点不同。这就是我想做的事情..

基本上我的所有客户数据都存储在数据库中,在3周或4周后,我不再需要他们的数据,例如地址,城市,州,邮政编码,电话,电子邮件地址,他们订购的产品等。

现在这些数据以原始格式存储在数据库(mysql)中。

我想的是,在某些日子之后,我将加密存储在mysql数据库中的所有数据,而不是存储密钥,我每次都会通过输入框手动输入它(当想要加密它时或者由于某种原因解密它只是为了显示在屏幕上)。

所以基本上这是它如何运作..

1)在mysql中选择客户的记录

2)通过输入框

获取加密密钥

3)通过加密数据来更新mysql记录

所以这是我的两个问题......

1)上面提到的是一个好的策略,如果数据库被泄露,数据就会受到保护。此外,如果入侵者要获得对代码的访问权限,他们将无法访问密钥,因为它不会存储在任何php文件中的任何位置。

2)我应该如何设置加密系统?我应该使用mysql的函数AES_ENCRYPT(请记住,数据的长度可能会有所不同,例如地址,电子邮件地址或有关客户的其他信息)

4 个答案:

答案 0 :(得分:2)

Public-key cryptography可能是比AES更好的选择。它使用两个键而不是一个。使用公钥加密的数据只能通过私钥解密。这意味着您不必过于担心公钥落入坏人之手,因为实际上不能使用它来解密数据。

PHP公钥加密的最佳选择是standard OpenSSL extension,它使用行业标准的RSA系统。

密钥可以存储在PEM-encoded(花式base64)文件中requires a passphrase来解锁。这是您要提示用户的密码,而不是实际的密钥。这是幸运的,因为安全的RSA密钥相当大,无法准确记忆。这也允许您将私钥安全地存储在服务器上。

此外,它应该是显而易见的,但您可能希望确保通过SSL为您的应用程序提供服务,即使这是一个完全内部的应用程序。在不保证数据传输安全的情况下保护数据是愚蠢的。

答案 1 :(得分:2)

这个方案听起来好像很好用。只需要处理一些细节。

AES_ENCRYPT(这很好 - 这也适用于您可能使用的任何其他加密方法)返回二进制字符串。您需要将其存储在可以包含二进制字符串(BINARYVARBINARYBLOB变体)的列中,而您可能将预加密信息存储在非二进制字符串列中。因此,您需要为加密信息设置另一组列,或使用一些基于文本的编码将加密数据放在用于未加密表单的相同列中。

此外,您应该非常小心您的应用程序逻辑,以免意外地使用未加密的数据重新填充加密行(想想视图记录等场景 - >解密 - >保存更改)。

最后,如果坏人有对您的服务器/应用程序的写访问权限,那么他们可能会很好地拦截加密密钥并保存它。由于密钥对于所有记录可能是一个并且相同(由于密钥管理考虑因素),因此这对于他们获取所有数据就足够了。但如果他们只管理读访问权限,那就很好。

答案 2 :(得分:1)

您还应该考虑如何在发生攻击时更改密码。 @Charles的想法适用于此,但使用RSA加密实际数据可能会很慢(公钥算法比对称密码慢得多)。

我建议你在Charles建议和你最初的想法之间做些什么。存储单个加密密钥,但请确保密钥使用密码加密。使用单个密钥加密数据。当用户想要解密数据时,他们可以输入密码,这使他们可以访问密钥。

您现在可以随时更改密码,而无需更改加密密钥,也无需重新加密所有数据。

AES是实际加密工作的不错选择。它很快,并且经过深入研究。

答案 3 :(得分:1)

我不确定这对你是否有用,但上个月在RSA有一家公司在Linux上为mySQL提供透明数据加密。它们还有一种管理和存储密钥的方法,以便它们与数据分开。适合PCI,HIPAA-HITECH等......

他们在mySQL写入时加密到光盘,并在请求数据时解密。根本没有对应用程序或数据结构的更改。公司是Gazzang。只需搜索它们,或查看RSA Innovation Sandbox 2011。

希望这有帮助