加密/解密数据库中的信息

信息安全 验证 加密
2021-08-13 10:40:37

因此,假设我有一条秘密消息要加密并存储在我的数据库中,经过身份验证的用户可以从中检索、解密、读取、更新消息。

编辑:我遇到的问题是:使用相同的密码进行授权和解密是没有意义的。通常,哈希密码存储在数据库中以验证用户。但是,如果我也使用哈希密码来加密消息,那么一旦黑客看到数据库,他所要做的就是使用哈希密码解密消息

通过进行一些stackoverflow搜索(http://stackoverflow.com/questions/2388256/secure-encrypted-database-design?rq=1),如果我理解不正确,现在纠正我,似乎解决方案是加密用公钥加密消息,用私钥解密消息,然后用用户密码对这些私钥进行对称加密。然后可以将加密的私钥存储在数据库中。总而言之,它是这样工作的:用户提供一个密码,它解密存储在数据库中的私钥,然后用它来解密存储在数据库中的秘密消息。

现在,我的问题是:你可以使用密码来验证和解密消息吗?在成功解密私钥之前,我不希望黑客能够猜测密码,所以一些用户身份验证(即用户名、密码、在数据库中存储散列密码)会很好。但是,必须同时输入验证密码和密码才能解密消息的想法似乎过分了。

我相信我可能误解了链接的帖子,但我的最终问题是如何构建安全系统,以便可以在数据库中加密消息(如果有人未经授权访问数据库)而无需一个人的密码是解密的关键。

2个回答

是的你可以。

可以使用相同的密码进行身份验证和数据加密。你需要的是获得从密码,用你喜欢的密钥导出函数,一个足够长的依赖密码流。然后,您使用流的前半部分进行身份验证(这是您存储在数据库中的部分),后半部分作为加密密钥。

对于 KDF,例如使用PBKDF2,使用 SHA-256 作为内部散列函数。调整迭代次数,使计算代价相当高(高迭代次数会减慢每个人的速度:您的服务器,以及试图猜测密码的攻击者;因此将其设置为高)。确保为每个密码选择一个新的、随机的、足够大(比如 16 个字节)的盐(你将把盐和散列值一起存储在数据库中)。用 PBKDF2 生成 32 个字节;使用前 16 个字节作为身份验证令牌(存储在数据库中),并使用其他 16 个字节进行加密(使用适当的对称加密系统,最好是具有集成完整性检查的系统,例如EAX

如果您应用了所有这些并且没有搞砸实现,您将确定当您被黑客入侵时,这将是用户的错(例如,一个用户将使用他的狗的名字作为密码)。

我认为您的目标是分层安全模型。因此,您希望能够使用某个密钥加密数据,但该密钥应该独立于密码。因此,如果密码被盗或被黑客入侵,数据不会受到损害。

安全性可以基于

  • 您拥有的东西(物理 SSH 文件、secureID 设备、验证密码后发送的 SMS 代码)
  • 你知道的东西(密码)
  • 你是什​​么(生物识别)

在这种情况下,您要做的是结合多种事物以提供更强的保护。您已经有了密码,所以最好从您拥有的东西或您是的东西中挑选。

生物识别技术可能对您的场景来说是一种过度杀伤,所以我建议您拥有一些东西。

您可以验证他们拥有的东西,例如一次性密码器(安全 ID 设备)之一,或者您只允许通过 SSH 连接,隐式验证 SSH 密钥(已预先注册)。您还可以向已注册的设备发送短信,并要求用户匹配代码。如果匹配,则解密数据。在这里,密钥的选择并不那么重要。它可以独立于用户,也可以对每个用户都是唯一的。

如需更多专家建议,我建议您前往https://security.stackexchange.com/,希望有人可以为您指明正确的方向。

这也作为两因素身份验证而变得流行。