将私钥存储在数据库中

时间:2014-04-21 13:44:17

标签: security encryption key private

我需要为多个用户存储私钥,以便我的服务器应用程序可以代表他们签署文件。

我想安全地存储私钥,但我无法找到最佳实践。如果我正在存储密码,我会使用密码来哈希密码,以便制作一个无法轻易转回密码的哈希值。但是,使用私钥我需要以稍后检索它的方式存储它。

我以为我会加密私钥,然后将其存储在我的数据库中。我原本以为每个密钥都会使用不同的密码加密(基于用户的某些属性)。但是,这些属性很可能存储在数据库中,因此如果我的数据库被泄露,那么攻击者就拥有了所有内容。

我可以使用仅为我的应用程序所知的单个密码加密所有私钥。然后攻击者必须窃取我的数据库,并且我的应用程序会造成任何伤害。

我缺少一种技术/最佳实践吗?

1 个答案:

答案 0 :(得分:15)

您可以使用基于用户密码的对称密钥加密私钥。只需存储额外的盐并执行密码" hash"获得一个单独的密钥。然后使用它作为加密私钥的密钥。请注意,需要使用基于密码的密钥派生函数(PBKDF)(如PBKDF2,bcrypt或scrypt)来创建安全密码哈希(给定密码的正常安全级别)。

如果用户在需要生成签名时不在线,那么您确实应该保护密码,只有您/我们的后台可以解密密钥。您可以使用某些用户ID +您自己的密钥来计算加密/解密密钥。您甚至可能希望生成单独的RSA密钥对来执行混合加密解密。

代表用户存储私钥是一种非常危险的做法。私钥暴露的方式有很多种(例如,旁道攻击)。要做到专业,你应该在这个过程中的某个地方使用HSM。如果这是任何严重的数据,请咨询专业人士和律师。