存储公钥和主密钥的安全方法是什么



我正在使用带有RSA加密和解密功能的AES进行客户端和服务器的安全通信。我被告知要在Javascript中硬编码公钥以进行登录,并在Java中硬编码其关联的私钥。这同样适用于注册过程,但登录和注册的密钥对会有所不同。

现在棘手的部分是,我必须在每个用户登录后为其生成一个密钥对,并为该特定用户使用该密钥对,直到他注销或会话超时。假设我有 1000+ 个用户,我必须在每次创建新会话时生成密钥,并为该用户维护相同的密钥对,直到注销或超时。

这些是我对如何存储公钥和私钥的想法

1)我们必须在将公钥和私钥保存到文件之前定义文件的名称。我们可以使用登录用户的用户名将其添加到保存的文件中,例如 - Dan.Public.key 和 Dan.Private.key ,如果是其他用户 - Ken.Public.key、Ken.Public.key(Dan 和 Ken 是用户名)

即使用户"Dan"注销或他的会话超时,我的过滤器也会在他再次登录后创建一个新的私钥和公钥,并将密钥再次保存到 Dan.Public.key 和 Dan.Private.key,因此它会自动覆盖同一用户上次使用的密钥文件。通过像这样定义文件名,我可以为任意数量的用户管理它,而不必担心安全性(当然,我必须完美地配置谁可以访问密钥文件夹)。谈到我的实时问题,我的应用程序是 API 调用,所以根本没有会话。管理会话的唯一方法是通过生成 UUID 并使用它来维护用户的会话并保留用户的日志来处理它。

如果我必须为每个调用获取公钥和私钥,首先我必须检查数据库以找到与当前 UUID 关联的相应用户名。从长远来看,这是一种非常糟糕的方式。我也可以使用UUID而不是用户名为密钥文件命名,但它很快就会损坏我的服务器,因为由于唯一的UUID,不会覆盖已经保存的文件(没有办法覆盖上次使用的密钥文件,因为每个新的UUID都是唯一的)

2)我可以简单地将公钥和私钥与生成的UUID一起存储到数据库中,因此我可以简单地获取这些密钥以进行加密和解密.add(Restrictions.eq("UUID_USER",UUID));但是我担心将其直接存储在DB中时的安全性。

注意:到目前为止,我不知道如何将公钥和私钥存储在数据库中。

我使用了迭代计数为 100000+ 的 PBKDF2WithHmacSHA256,盐为 16 字节,以防止密码泄露,即使黑客获得了数据库。比较密码存储的高安全性以及直接在数据库中字符串私钥和公钥的漂亮转储想法,我觉得这两个安全级别之间的差距很大。

我已经阅读了一些关于在密钥库中存储密钥的信息,但我不知道它是如何工作的。如果我选择将密钥存储在数据库中,我可以在 java 中对这些密钥使用某种硬编码加密和解密吗,但这会减慢每次单击的处理时间,如果更多用户同时登录,这对服务器来说将是重量级的。在考虑加密编码时,我什至不是中等水平,但我不想为一个部分实现高安全性系统,为另一个部分实现 0 安全系统。如果有人以前处理过此类应用程序,请分享您如何处理公钥和私钥的存储。

我假设用户密钥用于对从客户端发送到服务器的数据进行签名或加密从服务器发送到客户端的数据。

您真的不应该将用户的私钥存储在服务器上(或为此生成)。最好在客户端上生成密钥对,并将公钥发送到使用服务器公钥加密的服务器。

服务器(和开发人员/操作)永远不会收到用户私钥,也无法模拟用户。每次用户登录时,都会生成一个新的密钥对,并在数据库中覆盖公钥。

请注意,这并不能完全保护您免受攻击,因为基于网络的攻击者可能只是注入额外的 JavaScript 来窃取用户私钥或指示客户端将所有信息直接发送给攻击者。解决这个问题的唯一方法是使用SSL/TLS。

最新更新