PHP MySQL - 在不存储 key 的情况下动态加密解密数据

标签 php mysql encryption

我已经回答了几个与此相关的 SO 问题,而我的方法在加密数据方面有点不同。这是我想做的..

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

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

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

所以基本上这就是它的工作原理..

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

2) 通过输入框获取加密 key

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

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

1) 从某种意义上说,如果数据库遭到破坏,数据将得到保护,那么上面提到的是不是一个好的策略。此外,如果入侵者要访问代码,他们将无法访问 key ,因为它不会存储在任何 php 文件中的任何位置。

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

最佳答案

这个方案听起来很管用。只有一些细节需要您注意。

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

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

最后,如果坏人对您的服务器/应用程序具有写入权限,那么他们很可能会拦截加密 key 并保存它。由于所有记录的 key 可能是同一个(出于 key 管理方面的考虑),这足以让他们获取您的所有数据。但如果他们只管理读取访问权限,那你就很好。

关于PHP MySQL - 在不存储 key 的情况下动态加密解密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5446362/

相关文章:

sockets - Log4cplus:SocketAppender 是否有加密选项?

javascript - 如何在没有 cookie 的情况下识别以前的用户/垃圾邮件发送者?

php - 不是 PHP 与 JS 比较 : Can I do anything in PHP that can be done with JS?

c - 如何使用某物的 ASCII 值

java - 找不到类 java.lang.ClassNotFoundException : com. mysql.jdbc.Driver

php - 搜索mysql数据库

c# - 将 "Promo Code"功能添加到我的 ASP.NET C# 网站

php - 基于付款方式的 WooCommerce 订单接收重定向

javascript - 如何从网站获取 : js, css、图像等所有文件并保存以供离线使用?

mysql - 计算每行 mysql 的空变量数量