【问题标题】:RSA keys keys static generationRSA 密钥密钥静态生成
【发布时间】:2014-04-16 04:44:06
【问题描述】:

我正在通过here 给出这个答案来指导自己,它解释了如何同时使用 AES 和 RSA。

我成功地使用 util 类实现了 AES 部分,在该类中我使用密码来生成密钥。此密码不会更改,其目的是在对密码进行编码并将其保存到数据库之前对其进行加密。然后,每当我需要解密此密码时,我都可以使用相同的密码来解密,这应该会生成相同的密钥。我有这个工作。

现在我的问题从 RSA 开始。我必须通过 Java JAX-RS Web 服务通过 JSON 发送信息以注册用户。由于...“技术”原因,HTTPS/SSL 是不可能的。因此,我至少尝试发送用公钥加密的密码。并用服务器上的私钥解密。

然后我使用 AES 对其进行加密并将其存储在数据库中。

如果我每次都必须生成不同的密钥,我的客户端 (android) 怎么知道公钥?

【问题讨论】:

  • 由于它使用 ECB 模式和 SHA-1 进行密钥派生(后来针对 PBKDF2 进行了修改),它向您展示了如何不使用 AES。
  • 谢谢,我发这个帖子的时候好像分心了。

标签: java android security cryptography jax-rs


【解决方案1】:

您不必每次都生成新的 RSA 密钥。您每次都可以简单地使用公钥进行加密。如果数据太大,那么你应该尝试使用混合加密(即每次生成一个随机的 AES 密钥,用它加密消息,然后用 RSA 密钥对的公钥加密 AES 密钥)。

您可以简单地在您的 Android 应用中分发公钥。

最好不要在服务器上使用对称加密,如果您想存储密码进行身份验证,请在服务器上生成盐并对密码执行 PBKDF2。然后存储盐和 PBKDF2 的结果。然后,每当进行身份验证尝试时,检索 salt,再次执行 PBKDF2 函数并将结果与​​数据库中的值进行比较。

【讨论】:

  • 所以你的意思是,我可以生成 RSA 密钥并将它们存储在某个地方,比如文件(作为文本?比如 base64?),使用我的私钥解密我从我的客户端并安全地分发我的公钥(作为文本?就像以前的 base64 一样?),以便人们可以在他们的客户端应用程序中使用它来加密?
  • 基本上是的。当然,如果您正在处理其他应用程序,则必须确保其他应用程序也是安全的。此外,其他应用程序必须能够信任您的公钥。一种方法是使用受 TLS 保护的网站分发公钥。或者使用您的 PGP 私钥(如果您有的话)对其进行签名。请注意,与使用 PGP 容器进行分发相比,您可能做得更糟。