将加密数据存储在数据库中的最佳做法是什么?

时间:2017-09-24 09:53:02

标签: mysql database security encryption

我正在建立一个网站,用户将在其中存储敏感数据。有权访问数据库的人不应该能够查看这些数据,但我不能使用散列函数,因为用户需要查看他们存储的数据。我应该怎么做呢?

1 个答案:

答案 0 :(得分:5)

TL; DR:加密数据库列并没有多大帮助。

最佳做法:在花费时间和金钱保护系统之前,先找出您的威胁模型。如果您在没有明确威胁模型的情况下构建复杂的安全措施,那么您就会陷入虚假的安全感。

而且,加密DBMS中的列是一项复杂的安全措施。

你的威胁模型是什么?你会得到什么攻击?通过谁?攻击会如何伤害你?

您最可能的局外人攻击来自网络犯罪分子闯入您的网络服务器以窃取您的用户'提交身份盗窃(Equifax),勒索(Ashley Madison)或间谍(美国政府人力资源数据库)的信息。

如果您对DBMS中的某些列进行加密,并且您的Web用户需要能够查看和更新​​这些列,则您的Web服务器必须知道加密和解密密钥。如果犯罪分子篡改您的网络服务器,他将拥有您的密钥。因此,他将可以访问dbms的加密列。而且,他会有一个很大的路标说 LOOK!这是秘密的东西!

当然,还有很多其他可以想象的局外人攻击。有人可以突破你的防火墙并直接点击你的数据库。有人可以进入缓存并获取缓存的敏感数据。有人可能猜到你的网络应用程序的管理员密码。或者,窃取批量上传文件。

您提出的设计会想象内部攻击。必须阻止已拥有DBMS访问凭据的人员查看某些表中的某些列。他们将如何处理这些信息?你没有说。什么是威胁?

停止加密,你可以做这些事情,以防止你的内部人员侵犯你的用户'保密性。

  1. 完全从系统中获取敏感数据。例如,如果您正在处理信用卡,请使用stripe.com或braintree.com。他们会为您保守秘密,他们拥有优秀的网络安全团队。
  2. 理清你是否可以信任你的内部人士。调查未来的员工等。
  3. 制定明确的安全政策。例如,"我们从不查看credit_card表,除非我们有特定需要这样做。"如果您在美国处理医疗保健数据,您已经拥有HIPAA指南。让内部人员了解并同意您的指导方针。
  4. 故意违反这些政策的内部人员。
  5. 构建机制以帮助实施策略。向每个内部人员发出他或她自己的用户名/密码对以访问DBMS。在表和列级别使用选择性GRANT操作来允许和禁止查看数据。例如,

     GRANT SELECT (name, address) ON person TO username@'%';
    
  6. 允许username查看nameaddress列,但不能查看taxpayer_id表中的person列。读这个。 https://dev.mysql.com/doc/refman/5.7/en/grant.html#grant-column-privileges

    将时间和金钱花在保护DBMS计算机的良好防火墙上。研究OWASP并遵循这些做法。花时间和金钱运行您的Web应用程序的渗透测试并解决问题。花在审查和训练你的内部人员上花费他们。这些东西比想象中的加密列的魔法子弹更有效地减缓了攻击者。

    关于这两个家伙和熊的笑话。

      熊:咆哮。

         亚当:哦,我不知道我们是否能比这只熊跑得更快。

         比尔:我必须跑得比你快。

    这是处理小型网站安全性的好方法。让它变得难以破解,坏人会攻击别人。

    如果您正在运行一个包含大量敏感记录的大型网站(我正在看着您,Equifax),这还不够好。