如何使用Rails保护数据库中的用户数据?

Jer*_*ack 13 database security encryption ruby-on-rails

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

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

Bob*_*man 13

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

总是假设如果黑客可以危及您安全的任何部分,他们可能会妥协所有部分.连锁只有最薄弱的环节才能发挥作用.

信用卡号码和社会安全号码(幸运的是你通常不需要索引)可能是最明显的例外,但如果你不得不提出这个问题,你就没有办法将这些物品存放在第一个地点.你可以搞得有各种各样的法律麻烦来弄乱这些东西.

  • 我认为违反使用分层安全机制的行业标准是不好的建议.您对链条的引用仅与其最薄弱的环节一样强,不适用于防御机制的分层.但是,除非必要,否则您建议不要存储任何敏感信息. (6认同)
  • Bob--一个更有用和准确的假设是:假设,如果有足够的时间,攻击者将破坏特定的安全功能.出于这个原因,你可以使用多层深度防御 - 这有助于减缓攻击到你可以看到它并做出反应的点. (3认同)

小智 9

信用卡号,SSN等应始终加密存储.

密码应始终使用单向散列加密存储.这意味着当用户提供密码时,您可以确定它是否与您在数据库中存储的内容相匹配,但只给出了数据库中的加密表示,您无法从中确定密码,而不是暴力/字典攻击.

我发现在我的应用程序中,我喜欢将未加密的_****读者和作者添加到我的班级中,以便轻松处理加密表示.

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
Run Code Online (Sandbox Code Playgroud)


Ped*_*der 5

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

您绝对不应“假设它将永远不会受到损害”