security - 将私钥存储在数据库中

标签 security encryption key private

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

我想安全地存储私钥,但我找不到相关的最佳实践。如果我要存储密码,我会对密码进行加盐+哈希处理,以生成无法轻松转回密码的哈希值。但是,对于私钥,我需要以以后可以检索它的方式存储它。

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

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

我是否缺少某种技术/最佳实践?

最佳答案

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

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

代表用户存储私钥是一种非常危险的做法。有很多方法可以暴露私钥(例如侧信道攻击)。要专业地完成此操作,您确实应该在此过程中的某个地方使用 HSM。如果这是任何严肃的数据,请咨询专业人士和律师。

关于security - 将私钥存储在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23198698/

相关文章:

sql - 对什么是 superkey 或 Boyce Codd Normal 形式的误解

JavaScript:深度检查对象具有相同的键

安卓权限: How can I learn which are dangerous vs normal?

security - 盐的目的是什么?

security - 为系统定义安全策略

.net - 从网络共享运行 "partially trusted".NET 程序集

java - 构造 EncryptedPrivateKeyInfo 时出现异常

php - Android 和 PHP 之间的加密/解密问题

java - 为php和java实现的加密方法?

MySQL 通过 ODBC 进行多重插入和重复键更新问题