14

我正在构建一个包含健康信息的应用程序。这个应用程序将面向消费者,对我来说是新的。我想要一种让隐私问题完全放心的方法。当我回顾在可公开访问的数据库中保护敏感数据的方法时,我经常遇到数据库半透明的概念。Oriellynet有关于该主题的原著和关于该主题的优秀教程。

我担心的是,关于我认为非常现代的编程网站(比如这个)的这个想法,我看到的信息很少。维基百科上似乎没有关于这个想法的文章。这里没有关于这个主题的问题,也没有关于这个主题的最新教程或文章。简而言之,这个想法是某些数据对系统的某些用户是清楚的,而其他用户则通过加密方式阻止访问该数据,即使他们具有管理员访问权限。

我在提供半透明数据访问的原型数据库上做了大量工作。我遇到了一个相当大的问题:要真正半透明,不能有密码恢复机制。如果管理员可以重置用户密码,那么他们可以短暂访问用户数据。要真正做到半透明,用户绝不能丢失密码。

我们这些在日常生活中使用强加密来保护私人数据的人(当然是technorati)在使用这些强加密系统时已经习惯了这个问题。如果“河豚”这个词是您日常词汇的一部分,那是一回事,而是一个以消费者为中心的网站?我担心用户不会愿意围绕“真正为您加密”的概念与真正的数据库半透明隐含在一起。我害怕以“我丢失密码”开头并以“我无能为力”结尾的支持电话。

我的问题:我应该在我的应用程序中实现这个方法吗?是否有其他开源应用程序沿着这条路线走,我可以将数据库设计与之进行比较(尤其是使用 php/MySQL)?我还有其他人追求这种真正安全但真的很不方便的功能集吗?是否有另一种我错过的更流行和现代的数据库安全模型?数据库半透明是我应该接受的一种时尚还是一种合法的数据库设计方法?虽然我总是喜欢讨论,但我更喜欢可以在我的设计中利用的客观答案。

4

4 回答 4

7

所以,我最近一直在看类似的东西,并遇到了同样的问题。我正在考虑实施的解决方案如下:

  • 注册后,为用户创建一个唯一的、安全的(长)密钥,并使用它来加密他们的数据。
  • 使用例如 AES 使用用户密码加密此密钥并将其存储在数据库中。

此时,您仍然处于如果用户忘记密码,他们已经拥有密码的情况。

  • 创建一个代表您的组织的公钥/私钥对,并将公钥存储在服务器上。
  • 将密钥的私人部分分成几个部分,并将每个部分交给与贵公司的持续成功有重要关系(最好是财务)的人(例如贵公司的董事)。这样做是为了让任何两个或任何三个人可以聚在一起并在需要时恢复完整的私钥。用他们自己的密码加密每个人的密钥。
  • 当用户注册并用他们的密码加密他们的密钥时,用组织公钥加密它并将其存储在某个地方。
  • 创建一个密码重置表单,记录重置用户密码的请求,以及一些证明用户就是他们所说的人的证据(例如挑战/响应)。
  • 在数据库中记录这些重置请求(可选择再次使用公钥加密)。
  • 每小时/每天/每周/每月一次,将必要的密钥持有者聚集在一起,并使用他们的组合密钥来处理累积的重置请求,解密成功证明他们是他们所说的人的用户的密钥。

在这方面有很多挑战和考虑。我对其中的大多数有一些想法,但也会对其他人的意见感兴趣:

  • 如何在多人之间安全地拆分密钥,以便没有人可以解密存储的密钥。
  • 如果“万能钥匙”真的落入坏人之手,如何最大限度地减少暴露的钥匙数量。
  • 如何确保如果(天堂禁止)您的密钥持有者丢失了他们的密钥,那么 (a) 没有数据泄露的风险,并且 (b) 没有突然重置密码的能力永远丢失的风险。
  • 如何成功验证某人确实是他们所说的那样,而不会使这成为整个安全方法中的一个明显漏洞。

毫无疑问,您在这方面实施的任何操作都会降低半透明数据库方法的安全性,但根据您的数据性质,这可能是一个值得妥协的折衷方案。

于 2010-12-20T18:18:27.497 回答
2

我应该在我的应用程序中实现这个方法吗? 就像生活中的其他事情一样,有一个权衡:) 它可能更安全但更难构建。

是否有其他开源应用程序沿着这条路线走,我可以将数据库设计与之进行比较(尤其是使用 php/MySQL)?

不知道,我想工具可以自己做:)

是否还有其他人在追求这种真正安全但又不方便的功能集?

是的,但它似乎仍处于不成熟状态,就像您描述的有关丢失密码的问题。

是否有另一种我错过的更流行和现代的数据库安全模型?

基本上有两种数据库连接。一种选择是为用户提供一个真实的数据库帐户,另一种是对数据库使用单点登录。在 Web 出现之前,客户端/服务器世界中都有这两种模型的支持者,但在 Web 开发人员中,单点登录方法处于领先地位。

数据库半透明是我应该接受的一种时尚还是一种合法的数据库设计方法?

不要这么认为,例如,UNIX 密码数据库是基本半透明数据库的一个很好的例子;)

这里有一些东西可以阅读链接文本

于 2010-01-21T21:44:44.533 回答
1

回复:半透明数据库。我想你可以使用指纹。烧伤受害者或最终失去指纹的人呢?哎呀。值得那一小部分用户吗?

熟悉HIPAA,尤其是在技术方面。请记住,除了 Skynet* 之外,没有任何系统是真正安全的,看看发生了什么!人类负责。当您在一家医疗公司工作时,您签署了一份保密协议,表明您不会发布您在职责范围内了解到的任何信息,因为这些信息是保密的。会有人重置人们的密码。就是这样,因为不是每个人都具备技术能力,而这就是现在的样子。你只需要像 HIPAA 所说的那样实现安全性。

  • 事实上,还有另一个真正安全的系统:它既断开了网络,也断开了电源,并且被关闭了。
于 2010-01-21T20:33:33.223 回答
0

稍微不同的解决方案,您可能需要查看 cryptdb:

http://css.csail.mit.edu/cryptdb/

于 2013-05-09T02:41:22.437 回答