将私钥存储在数据库中

Posted

技术标签:

【中文标题】将私钥存储在数据库中【英文标题】:Storing private keys in database 【发布时间】:2014-06-05 14:16:08 【问题描述】:

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

我想安全地存储私钥,但我找不到解决此问题的最佳做法。如果我要存储密码,我会对密码进行加盐+哈希处理,以生成一个不容易转换回密码的哈希值。但是,使用私钥我需要以以后可以检索的方式存储它。

我想我会加密私钥,然后将其存储在我的数据库中。我最初认为每个密钥都将使用不同的密码进行加密(基于用户的某些属性)。但是,这些属性很可能会存储在数据库中,所以如果我的数据库被泄露,那么攻击者就会拥有一切。

我可以使用只有我的应用程序知道的单个密码来加密所有私钥。然后攻击者必须窃取我的数据库和我的应用程序才能造成任何伤害。

是否有我缺少的技术/最佳实践?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

嘿,Maarten,您能解释一下“简单地储存额外的盐”在这个过程中的作用吗? @wimdetr PBKDF2 要求每个密钥派生一个唯一的盐,在这种情况下,应该使用不同的密码/盐组合生成对称密钥。然后可以使用生成的对称密钥(通常是 IV)来包装(加密)私钥。只要可以检索到用于解密的包装密钥,盐的存储位置就无关紧要。也许阅读 PKCS#5(基于密码的加密)了解更多信息。

以上是关于将私钥存储在数据库中的主要内容,如果未能解决你的问题,请参考以下文章

如何将私钥内容放入 dotenv .env 文件中以用于 lumen 应用程序?

openssl将私钥和crt证书合成pfx证书

将私钥放入带有变量的 application.yml

如何在 Go 中存储 ECDSA 私钥

如何将私钥转换为 RSA 私钥?

openssl将私钥和crt证书合成pfx证书