在数据库中安全地存储用户生成的文本(Ruby / Rails)

8
我正在尝试找到一种安全地将用户生成的文本存储在数据库中的方法(以便只有用户可以访问他/她存储的文本)。我可以让Rails使用用户的密码作为密钥来加密和解密用户的文本条目,但如果用户忘记了密码,就没有办法解密他们以前的内容/文本(因为Rails应用程序仅使用BCrypt存储密码的哈希值)。
有人知道如何做到这一点吗?看起来Dropbox做了类似的事情:“存储在Dropbox服务器上的所有文件都经过加密(AES-256),没有您的帐户密码,无法访问。”(http://www.dropbox.com/help/27)然而,他们允许您重置密码,我假设他们不会在任何地方存储您的明文密码。
我错过了什么?任何建议都将不胜感激。谢谢!

3
我不相信Dropbox(和其他公司)拥有“没有您账户密码就无法访问”的数据。他们的意思是,他们可以解密数据,但如果没有先进行身份验证,他们不会为您这么做。据推测,他们将密钥和加密数据分开保存,以便如果有人丢失硬盘,则数据将是安全的。 - Bill Dueber
2个回答

0

逻辑指出只有两种选择:

  1. 使用服务器已知的密钥(用户密钥哈希或其他标识符)进行加密。入侵者可能可以读取所有加密数据,但是用户永远不会失去加密令牌,因为它位于您的服务器上。
  2. 仅使用用户已知的密钥(例如,他的密码)对数据进行加密。然后入侵者将无法读取加密数据,但如果用户丢失了密钥,则数据就像一堆随机位一样无用。

很明显Dropbox选择了第一种方式,因为他们允许重置密码。


谢谢,这很有道理。那么,如果我假设密钥必须存储在服务器上,那么如何在不让入侵者访问加密内容和解密密钥的情况下遵循选项1呢?也就是说,Web应用程序需要访问数据库和加密密钥,因此如果您获得对Web服务器的访问权限,则可以访问数据,对吗?如果是这种情况,那么该加密/解密方法提供了什么安全性?抱歉,我可能漏掉了一些显而易见的东西。 - James C.
安全性的提升在于不仅需要访问用户数据,还需要访问该数据的密码,这可能更加安全(例如,存储在独立的网络服务上,位于单独的安全强化机器上)。 - Gintautas Miliauskas

-1

在Gintautas的第一种选择的基础上,采用双重加密方案:

  1. 应用选项1,使用服务器已知的密钥。
  2. 以仅服务器知道的密钥将数据库以加密格式存储在磁盘上。例如,在加密卷中。当服务器启动时,必须手动输入密钥才能访问数据库。

第2部分提供的“静态安全性”可防止系统中的入侵者访问数据库文件。也许不是您想要的100%确切的安全性,但更接近了。


通常被黑客攻击的系统是在线的,因此如果加密卷在启动时已经挂载,攻击者将能够读取其中所有内容。我不认为您的建议有任何好处。 - Gintautas Miliauskas

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