PHP MySQL-动态加密而不存储密钥的解密数据

| 我已经经历了几个有关此的SO问题,而我的方法在想要加密数据方面有所不同。这是我想做的.. 基本上,我所有的客户数据都存储在数据库中,三周或四周后,我不再需要他们的数据,例如地址,城市,州,邮政编码,电话,电子邮件地址,订购的产品等。 现在,这些数据以原始格式存储在数据库(mysql)中。 我的想法是,几天后,我将加密mysql数据库中的所有数据,并且不存储密钥,而是每次都通过输入框手动输入(如果要加密,或者出于某种原因)解密它只是为了在屏幕上显示)。 所以基本上这就是它的工作方式。 1)在mysql中选择客户的记录 2)通过输入框获取加密密钥 3)通过加密数据更新mysql记录 这是我的两个问题... 1)从某种意义上说,如果数据库受到破坏,则数据将得到保护,上述方法是否是一个好的策略?此外,如果入侵者获得了对代码的访问权,他们将无法访问密钥,因为密钥不会存储在任何php文件中的任何位置。 2)我应该如何设置加密系统?我是否应该使用mysql的函数ѭ0Please(请注意,数据的长度可能会有所不同,例如地址,电子邮件地址或有关客户的其他信息)
已邀请:
听起来这个方案听起来不错。您只需要注意一些细节。
AES_ENCRYPT
(很好-这也适用于您可能使用的任何其他加密方法)返回二进制字符串。您需要将其存储在可以容纳二进制字符串(
BINARY
VARBINARY
BLOB
变体)的列中,而您可能会将预加密信息存储在非二进制字符串列中。因此,您可能需要为加密信息设置另一组列,或者使用一些基于文本的编码来将加密数据放入与未加密形式相同的列中。 另外,您应该在应用程序逻辑中非常小心,以免意外地用未加密的数据填充加密的行(请考虑以下情形:查看记录->解密->保存更改)。 最后,如果坏人对您的服务器/应用程序具有写访问权,那么他们很可能会拦截并保存加密密钥。由于所有密钥的密钥可能是相同的(由于密钥管理的考虑),这足以使他们获取所有数据。但是,如果他们仅管理读取访问权限,那就太好了。
与AES相比,对您而言,公钥加密可能是一个更好的选择。它使用两个键代替一个。使用公钥加密的数据只能由私钥解密。这意味着您不必担心公钥落入错误的人手中,因为使用它实际上无法解密任何数据。 对于公用密钥密码,PHP的最佳选择是标准的OpenSSL扩展,它使用行业标准的RSA系统。 密钥可以存储在需要密码解密的PEM编码(fancy base64)文件中。您想要提示用户输入的是此密码短语,而不是实际的密钥。这很幸运,因为安全的RSA密钥相当大且无法完全记住。这也使您可以将私钥安全地存储在服务器上。 同样,这应该很明显,但是即使这是一个完全内部的应用程序,您也可能要确保通过SSL为您的应用程序提供服务。在不保证数据传输安全的情况下保护数据是愚蠢的。
您还应该考虑在发生攻击时如何更改密码。 @Charles的想法可以解决这个问题,但是使用RSA加密实际数据可能会很慢(公钥算法比对称密码要慢得多)。 我建议您在查尔斯的建议和您的原始想法之间做一些事情。存储单个加密密钥,但请确保使用密码对密钥进行加密。用单个密钥加密您的数据。当用户想要解密数据时,他们可以输入密码短语,从而可以访问密钥。 现在,您可以随时更改密码,而无需更改加密密钥,也无需重新加密所有数据。 AES是实际加密工作的不错选择。它的速度很快,并且已经过充分研究。
我不确定这是否适合您,但是上个月在RSA上有一家公司在Linux上为mySQL提供了透明数据加密功能。它们还具有一种管理和存储密钥的方法,以使它们与数据分开。适用于PCI,HIPAA-HITECH等 它们在mySQL写入时加密到磁盘,并在请求数据时解密。完全无需更改应用程序或数据结构。公司是Gazzang。只需搜索它们,或查看RSA Innovation Sandbox 2011。 希望这可以帮助

要回复问题请先登录注册