【问题标题】:Storing user-generated text in database securely (Ruby/Rails)将用户生成的文本安全地存储在数据库中(Ruby/Rails)
【发布时间】:2010-12-10 01:45:34
【问题描述】:

我正在尝试找出一种将用户生成的文本安全地存储在数据库中的方法(这样只有用户才能访问他/她存储的文本)。我可以让 Rails 使用用户的密码作为密钥来加密和解密用户的文本条目,但是如果用户忘记了他们的密码,就无法解密他们以前的内容/文本(因为 Rails 应用程序使用 BCrypt 仅存储密码的哈希值)。

有谁知道如何做到这一点?看起来 Dropbox 做了类似的事情:“存储在 Dropbox 服务器上的所有文件都是加密的 (AES-256),没有您的帐户密码就无法访问。” (http://www.dropbox.com/help/27) 但是它们允许您重置密码,我假设它们不会将您的纯文本密码存储在任何地方。

我错过了什么?任何建议将不胜感激。谢谢!

【问题讨论】:

  • 我不相信 Dropbox(和其他人)有“没有您的帐户密码就无法访问”的数据。他们说的是他们可以解密它,但如果没有先对您进行身份验证,他们不会为您解密。据推测,他们将密钥和加密数据充分分开,以便如果有人丢失硬盘驱动器,数据将是安全的。

标签: ruby-on-rails ruby security encryption


【解决方案1】:

逻辑规定只有两种选择:

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

很明显,Dropbox 选择 (1) 是因为它们允许重置您的密码。

【讨论】:

  • 谢谢。这就说得通了。那么,如何在不让服务器上的入侵者访问加密内容和解密它的密钥的情况下遵循选项 1(因为我假设密钥必须存储在服务器上)?也就是说,Web 应用程序需要访问数据库和加密密钥,所以如果您可以访问 Web 服务器,您就可以访问数据,对吗?如果是这种情况,该加密/解密方法将提供什么安全性?抱歉,我一定在这里遗漏了一些明显的东西。
  • 安全收益是访问用户数据是不够的,您还必须访问该数据的密码,这可能更安全(例如,存储在隔离的 Web 服务上独立的安全强化机器)。
【解决方案2】:

以 Gintautas 的选项 1 为基础,采用双管齐下的加密计划:

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

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

【讨论】:

  • 通常被黑客入侵的系统是实时的,因此如果在启动时安装了加密卷,攻击者将能够读取所有内容。我认为您的建议没有任何好处。
猜你喜欢
  • 2017-03-06
  • 2011-07-11
  • 2018-01-05
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多