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

时间:2015-02-02 19:19:52

标签: java security session encryption cryptography

我正在使用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,所以它会自动覆盖同一用户最后使用过的密钥文件。通过定义这样的文件名,我可以为任意数量的用户管理它,而不必担心安全性(当然,我要完全配置谁可以访问keys文件夹)。来到我的实时问题,我的应用程序是API调用,因此根本没有会话。管理会话的唯一方法是通过生成UUID来处理它,并使用它来维护用户的会话并保留用户的日志。

如果我要为每个呼叫获取公钥和私钥,首先我要检查数据库以找到与当前UUID相关联的相应用户名。从长远来看,这是一个非常糟糕的方式。此外,我可以使用UUID而不是用户名给密钥文件命名,但它会很快损坏我的服务器,因为唯一的UUID不会覆盖已保存的文件(无法覆盖上次使用的密钥文件,因为每个新的UUID都是独一无二的)

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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