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

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

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

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

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

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

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

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

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

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 

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

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