【问题标题】:What is the secure way to store public and primary keys?存储公钥和主密钥的安全方式是什么?
【发布时间】:2015-04-01 20:02:00
【问题描述】:

我将 AES 与 RSA 加密和解密一起用于客户端和服务器的安全通信。我被告知要在 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)); 简单地获取这些密钥进行加密和解密但我担心存储时的安全性直接在数据库中。

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

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

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

【问题讨论】:

    标签: java security session encryption cryptography


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-15
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 2013-04-20
      • 2011-10-14
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多