将“敏感”数据存储在MySQL DB中

时间:2012-05-23 10:39:25

标签: php mysql encryption aes

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

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

2)我应该加密数据吗?

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

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

由于

4 个答案:

答案 0 :(得分:3)

如果攻击者可以访问纯文本数据,那么最糟糕的情况是什么?鉴于您必须解密数据以使其有用,因此您需要加密密钥在某处也可访问,任何可以访问数据库的攻击者也可能能够获取密钥,除非这是存档而不是例如一个真实的网站。我会专注于数据库服务器的安全性,除非您将硬盘驱动器装满可能丢失的数据,但这实际上取决于您需要加密它的原因。

答案 1 :(得分:3)

这是两者的混合物。两个现有的答案(在我写这个https://stackoverflow.com/a/10718397/1015483https://stackoverflow.com/a/10718459/1015483时)是有效的 - 你需要看看我能想到的大约5种可能的攻击方法

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

但未提及三个要素:

  • 他们可以访问您的Web服务器(如果与您的数据库服务器不同)。如果他们有权访问网络服务器,所有的赌注都会关闭,因为他们有你的密码,加密密钥。因此,您需要使其比数据库服务器更安全。 (马特可能意味着上述 - 但只是说清楚)
  • 与上述类似,但不要忘记,是否有人可以访问phpMyAdmin或您的管理消费者。不要使用纯文本身份验证或配置存储密码进行访问。
  • 最后是您的应用程序本身(并且最难锁定)。您需要防止可能泄露数据的SQL注入。如果有人通过未经检索的查询获得访问权限,加密数据将停止最小化问题 - 因此,加密就是解决方案。

对于问题的第2部分:

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

所以,IMO(这只是我的意见和我的方式)是用PHP加密并通过线路加密数据,因为这会停止所有捕获数据的方法,并且CSV转储将被“吵架”。

如果你这样做,你也可以使用varbinary / blob类型,因为它会阻止你不小心尝试在phpMyAdmin中读取/编辑。另外可能会名义上节省几个字节(虽然这取决于索引和其他东西 - 所以单凭这不是一个成功的论点)。


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

希望有所帮助。

答案 2 :(得分:1)

如果您需要保护可能被黑客入侵的数据库中的数据,您可以加密它 mcrypt

$key = "mykey";
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$key,$data,MCRYPT_MODE_ECB,$key);

之后,您可以根据〜预期的数据大小选择BLOB,TEXT,MEDIUMTEXT或其他任何内容。 *对于 VARBINARY / BINARY ,您可能需要首先pack

答案 3 :(得分:1)

加密操作会产生额外费用。

如果在您的方案中,如果您的数据增长到相当大的规模,则需要评估此额外费用是否会出现问题。

避免数据泄漏的第一个前沿是强大的数据访问策略,其中包含访问配置文件等。这样做的缺点是你需要管理mysql并配置它。

如果您想关注配置文件的管理,您可以加密数据,假设CPU的额外成本和(取决于加密算法)额外的存储空间。

系统的安全性等于更弱的组件的安全性,不要只把你的精力集中在加密任务上,这只会给你安全感,如果数据可以被解密,唯一的就是入侵者需要的是时间和暴力破解加密