在 MySQL 数据库中存储“敏感”数据

Cat*_*ANU 5 php mysql encryption aes

“敏感”数据应如何存储在 MySQL 数据库中?

1) 我应该更关注 MySQL 数据库的安全性并将数据存储为纯文本吗?

2)我应该加密数据吗?

  • 如果是,那么应该如何进行加密?
    1. 使用 MySQL aes_encrypt/aes_decrypt?
    2. 使用 PHP AES 函数/算法加密/解密数据?
  • 数据应该如何存储在 MySQL 中?
    1. BLOB
    2. 二进制
    3. VARBINARY

就我而言,“敏感”数据是个人支付的款项。

谢谢

Rob*_*bie 4

它是两者的混合体。两个现有的答案(在我写这篇文章时/sf/answers/750287821//sf/answers/750292161/)是有效的 - 你需要查看大约 5 种方法我能想到的可能的攻击

  • 他们可以访问您的数据库服务器;所以是的,尽可能合理地保护婴儿(马特的回答)
  • 独立数据劫持(有人以其他方式获取您的数据库数据,可能是备份,可能是猜测密码,如果您将数据从一个地方传输到另一个地方,则可能是 MITM)。为此,您需要加密您的数据。您还可能出于某种原因进行 CSV 转储并通过电子邮件发送给某人。哎呀。但这确实发生了。所以加密(vlzvt的回答)

但没有提到三个要素:

  • 他们可以访问您的网络服务器(如果与您的数据库服务器不同)。如果他们有权访问网络服务器,那么所有的赌注都会被取消,因为他们拥有您的密码、加密密钥等。因此,您需要使其比数据库服务器更安全。(马特可能是上面的意思 - 但只要说清楚)
  • 与上面类似,但不要忘记,如果有人访问 phpMyAdmin 或您的管理控制台。不要使用纯文本身份验证或配置存储的密​​码进行访问。
  • 最后是您的应用程序本身(也是最难锁定的)。您需要防止可能泄露数据的 SQL 注入。如果有人确实通过未捕获的查询获得了访问权限,那么加密数据将阻止最大程度地减少问题 - 因此,加密是解决方案。

对于你问题的第二部分:

使用 MySQL 加密/解密功能将阻止有权访问原始数据的人,但不会阻止 MITM 或 SQL 注入,甚至阻止用于传输的 CSV 转储。

因此,IMO(这只是我的观点和我所做的方式)是使用 PHP 加密并通过网络捕获加密数据,因为这会停止所有捕获数据的方法,并且 CSV 转储将被“扰乱” ”。

如果您这样做,您也可以使用 varbinary / blob 类型,因为它可以阻止您意外地尝试在 phpMyAdmin 中读取/编辑。另外,名义上可能会节省一些字节(尽管这取决于索引和其他东西 - 所以仅此一点并不是一个获胜的论点)。


现在是缺点:搜索和排序。您索引或搜索的任何内容,如果加密,将仅匹配填充到正确长度的整个、精确、区分大小写的字符串(通常搜索不区分大小写,并且您可以使用 LIKE 进行部分搜索)。如果你想 ORDER BY 那么你需要原始字符串。因此在设计结构时请记住。

希望有帮助。