【问题标题】:How to secure user data in the database with Rails?如何使用 Rails 保护数据库中的用户数据?
【发布时间】:2010-12-10 17:35:30
【问题描述】:

我正在创建一个需要存储大量敏感数据的 Rails 应用程序。为了向我的客户保证数据受到保护,我想按用户对其进行加密。我进行了研究,寻找可以实现这一目标的宝石。到目前为止,我已经找到了 strongboxsafe。总之,这似乎为我提供了一个解决方案。

但是,我想知道这是否是一种常见做法。似乎大多数 Rails 应用程序都有一些关于其用户的敏感数据要存储。 AuthLogic 正在处理我的密码加密,但电子邮件和其他个人数据同样敏感。将这些项目未加密地保留在数据库中并假设它永远不会被泄露,这是一种常见的做法吗?我知道数据库位于无法与外界通信的区域,但坚定的攻击者很容易破坏这一点。 Rails 开发人员的常见做法是不加密数据并简单地信任其 Web 服务器的安全性吗?

【问题讨论】:

  • 这个问题不是 rails 或 implementation specific。您可能会从迁移到 Security.stackexchange.com 中受益
  • @Rory:这个问题已经有将近两年的历史了,所以不会迁移到其他站点。
  • @Bill - wups - 我什至没有发现。我只是浏览安全标签,甚至没有注意日期。对不起。
  • @Rory:没问题。如果您发现任何绝对不是编程并且只有几个月或更短的时间您想要迁移的东西,请告诉我们。

标签: ruby-on-rails database security encryption


【解决方案1】:

加密数据库的问题在于,您加密的任何内容都不能在 SQL 查询中使用,而且在使用之前仍需要对其进行解密。这意味着您需要将解密密钥放在数据库附近,并且在大多数情况下,如果有人可以破坏您的数据库,这意味着他们同时也破坏了您的解密密钥。因此,加密步骤为您带来的收益很少。使用密码,不需要解密,因为它实际上是一个哈希函数。首先确保数据库永远不会受到损害会好得多。

始终假设,如果黑客可以破坏您安全的任何部分,他们也可以破坏所有安全性。链条的强度取决于其最薄弱的环节等等。

信用卡号和社会保险号(幸运的是,您通常不需要对其进行索引)可能是最明显的例外,但如果您必须提出这个问题,那么您就没有资格存储这些项目首先。搞砸这些东西会引发各种法律纠纷。

【讨论】:

  • 我认为违背使用分层安全机制的行业标准是一个糟糕的建议。您提到的链条仅与其最薄弱的环节一样强大,不适用于防御机制的分层。但是,除非必要,否则不要存储任何敏感信息的建议是好的。
  • Bob - 一个更有用和更准确的假设是:假设,如果有足够的时间,攻击者将破坏特定的安全功能。出于这个原因,您使用多层深度防御 - 这有助于将攻击减慢到您可以看到并做出反应的程度。
  • 虽然我承认纵深防御是个好主意,但加密数据库字段意味着您也必须解密它。您建议使用哪种加密/解密技术,使您能够让服务器出于合法目的安全地访问数据,如果您还假设您试图防御的威胁是已经拥有您的黑客盒子?
  • 如果你不加密数据,黑客只需要窃取你的数据。如果您加密数据,黑客需要窃取您的数据和密码。希望您拥有数据存储的备份和副本,因此,如果仅窃取您的数据就足够了,那么您将面临几个不必要的攻击向量。
  • 谁的密码呢?这就是诀窍。如果它是最终用户的密码,您必须不断提示输入密码才能访问任何加密信息。如果您将密码缓存到会话中,则会显着增加攻击面,如果您不这样做,则会不断提示用户。只是好奇,您是否曾经建造过其中一件并进行过审核?老实说,如果您还拥有良好的用户体验作为目标,这并不像您想象的那么简单。
【解决方案2】:

信用卡号、SSN 等应始终加密存储。

应始终使用单向哈希加密存储密码。这意味着当用户提供密码时,您可以确定它是否与您存储在数据库中的内容相匹配,但仅考虑到数据库中的加密表示,您无法从中确定他们的密码,除非是暴力破解/字典攻击。

我发现在我的应用程序中,我喜欢将 unencrypted_**** 读取器和写入器添加到我的课程中,以便轻松处理加密表示。

class User
  # has db column encrypted_cc_number
  def unencrypted_cc_number
    WhateverEncryptionClassYouUse.decrypt(encrypted_cc_number)
  end
  def unencrypted_cc_number=(val)
    self.encrypted_cc_number = WhateverEncryptionClassYouUse.encrypt(val)
  end
end

【讨论】:

    【解决方案3】:

    如果您要存储大量敏感数据,则使用分层安全机制和强加密是一种不错的做法。它是支付卡行业数据安全标准 (PCI DSS) 的要求。我建议您阅读以下指南文档:https://www.pcisecuritystandards.org/pdfs/pci_fs_data_storage.pdf

    你绝对不应该“假设它永远不会被妥协”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 2022-01-08
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多