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

The*_*row 0 mysql database security encryption

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

O. *_*nes 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@'%';
    
    Run Code Online (Sandbox Code Playgroud)

让我们username看一下nameaddress列,而不是表格中的taxpayer_idperson.读这个.https://dev.mysql.com/doc/refman/5.7/en/grant.html#grant-column-privileges

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

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

熊:咆哮.

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

比尔:我只需跑得比你快.

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

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