半透明数据库

14

我正在开发一款带有健康信息的应用程序。这个应用程序将面向消费者,这对我来说是新的。我想找到一种方法完全放心地解决隐私问题。当我审查在公开可访问的数据库中保护敏感数据的方法时,我经常遇到数据库半透明性的概念。有关于该主题的原始书籍,以及Oriellynet上关于该主题的优秀教程

我的担忧是,我在非常现代的编程网站(例如此网站)上很少看到与此想法有关的信息。维基百科上似乎没有关于这个想法的文章。这里也没有关于这个主题的问题,也没有最近的教程或文章。简而言之,这个想法是某些数据对系统的某些用户是明晰的,而其他用户则无法访问那些数据,即使他们具有管理员访问权限,也受到密码学的限制。

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

我们中使用强加密保护私人数据的人(确实是技术人员)在日常生活中已经习惯了这个问题,当使用这些强加密系统时。如果“blowfish”这个词是你日常词汇的一部分,那么这是一回事,但是对于面向消费者的网站而言呢?我担心用户不愿意理解与真正的数据库半透明性相关的“真正只为您加密”的概念。我害怕支持电话以“我忘记密码”开始,并以我说“我无能为力”结束。

我的问题:我应该在我的应用程序中实现这种方法吗?是否有其他开源应用程序也采用了这种方法,我可以比较数据库设计(特别是使用php/MySQL)?还有其他人追求这些真正安全但非常不方便的功能集吗?是否有其他更流行、更现代的数据库安全模型我错过了?数据库透明度是一时的潮流还是一种合法的数据库设计方法,我应该采纳?虽然我总是欢迎讨论,但我更希望得到客观的答案来支持我的设计。

4个回答

7

最近我在研究类似的东西,也遇到了同样的问题。我考虑实施的解决方案如下:

  • 注册时为用户创建一个独特、安全(长)的密钥,并使用该密钥加密其数据。
  • 使用例如AES等算法将此密钥与用户密码一起加密,并将其存储在数据库中。

此时,如果用户忘记了密码,您仍然处于困境之中。

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

在此过程中存在许多挑战和考虑因素。我对其中大部分都有一些想法,但也很想听取其他人的意见:

  • 如何安全地在多个人之间分割密钥,以便没有一个人可以解密存储的密钥。
  • 如何最小化如果“主密钥”真正落入错误的手中所暴露的密钥数量。
  • 如何确保如果(上帝保佑)您的密钥持有人失去了他们的密钥,则(a)不存在数据曝光的风险,(b)不存在突然永久丢失重置密码能力的风险。
  • 如何成功验证某人确实是他们所说的那个人,而不会成为整个安全方法中的漏洞。

在这个领域实施的任何事情都将无疑降低半透明数据库方法的安全性,但根据数据的性质,这可能是一个值得妥协的方案。


很好的回应。我想知道你的方法是否过于依赖通常是短暂的人。也许有人可以建立一个“密码重置服务”,提供类似于您建议的东西,但具有简单的API。例如,如果我有一个服务发布其公钥,允许您加密密码/密钥进行离线存储,并提供一个API,确定用户需要执行哪些步骤,以便服务使用私钥解密密码...例如,在特定电话号码回答文本消息等等。 - ftrotter
@Paul,你是否曾经实现了上述内容?很想知道你所做的设计决策。我也遇到了类似的问题,有许多相同的潜在问题。更新一下会很有趣。 - Bill Eisenhauer
@BillEisenhauer,抱歉,我没有做 - 最后,我没有将那个项目推进到概念阶段以外,因为它需要比我目前可用的时间/精力/资金更多。如果你想进一步讨论,我很乐意聊一聊...尽管我不确定在SO上如何最好地实现这一点? - Paul Russell

2

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

是否有其他开源应用程序使用此方法,我可以比较数据库设计(特别是使用php/MySQL)?

不知道,我想你可以自己尝试使用工具进行比较:)

是否还有其他人追求这些真正安全但非常不方便的功能集?

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

是否有另一种更受欢迎和现代的数据库安全模型我可能错过了?

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

数据库透明度是一种时尚还是一种我应该采用的合法数据库设计方法?

我觉得不是,例如UNIX密码数据库就是基本的透明数据库设计的一个很好的例子 ;)

这里有一些阅读材料链接文本


1
关于Unix密码数据库的观点非常好。您对您提到的“单一登录”问题有更多信息吗?谢谢, -FT - ftrotter

1

关于半透明数据库的问题,你可以使用指纹识别。但是如果有烧伤患者或者指纹丢失的人怎么办?这个小众用户群是否值得投入那么多资源呢?

请先了解HIPAA,特别是在技术方面。请记住,除了Skynet*之外,没有任何系统是真正安全的,而看看它发生了什么!人类掌控着一切。当你在医疗公司工作时,你需要签署保密协议,承诺不会泄露你在履行职责过程中获得的任何信息。

总会有人来重置密码。因为并非所有人都精通技术,所以现状就是这样。你只需要按照HIPAA的规定实施安全措施即可。

  • 事实上,还有另一个真正安全的系统:它既没有联网,也没有接通电源,而且已经关闭了。

我不敢想象一个系统已经从网络和电源中断开,但仍然处于开启状态。 - user47589
我本来在考虑买一台笔记本电脑,但突然想到了一台有意识的计算机的形象。 - Trevoke
如果还有人认为从网络中断开的计算机是安全的,那么可能还没有见过这些家伙:http://lasecwww.epfl.ch/keyboard/ - ercan
这个应用程序面向消费者,因此不受HIPAA保护。所以那些建议基本上毫无价值。除此之外,您还没有回答问题。 - ftrotter
我的简短回答是“不要实现这个”。 - Trevoke

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接