【问题标题】:How to safely store RSA private key to use it in java app? [duplicate]如何安全地存储 RSA 私钥以在 java 应用程序中使用它? [复制]
【发布时间】:2014-11-29 11:48:28
【问题描述】:

我想将我的 RSA 私钥存储在安全的地方,应用程序在将数据发送到服务器之前使用该私钥对其数据进行签名,这样窃取密钥要比从应用程序文件夹中复制要难得多。

我知道 Java KeyStore 可用于存储密钥并在运行时加载它们,但是如何在没有签名 jar 密码的情况下从 KeyStore 加载密钥?

例如,我已将密钥“mykey”加载到 KeyStore,并签署了 App.jar。我想在运行时从KeyStore 自动加载密钥,而不指定KeyStore 的密码,如果请求它的应用程序已签名。

也许,我没有正确理解KeyStore 的原理。但任务是对发送到服务器的数据进行签名并安全地存储密钥。 (该应用是一个POS应用,所以它应该是自动加载的,启动时不需要任何密码)。

【问题讨论】:

  • 你不能。你会在哪里存储密码?在代码中?反编译!在文件系统中?然后,您可以轻松地将未加密的私钥存储在同一个地方。这是不可能的。
  • 我虽然可以将 KeyStore 配置为仅向应用程序提供由指定证书签名的私钥。这样只有我编写和签名的应用程序才能在没有密码的情况下从 KeyStore 获取密钥。有没有其他方法可以在发送之前完成对应用数据进行签名的任务?
  • 如果这是一个功能:我会简单地获取您应用程序的证书(因为它未加密,它是您应用程序中的公开信息),将其交给密钥库并让它提取密钥我。 Keystore 无法知道证书来自哪里,我或使用该证书签名的某个应用程序。您可以使用密码 IRL 保护密钥库,但这会使该密码成为新的秘密,无处可放。
  • 那么,Java 怎么知道谁签署了这个应用程序?那怎么没有人可以用其他公司的签名来签署他们的代码呢?
  • @zapl 解释得很漂亮!这是一条死路,很多人都走下了这条路。

标签: java security key rsa keystore


【解决方案1】:

正如其他人所指出的,您无法真正阻止拥有该应用程序(因此拥有私钥)的人提取私钥。您可以混淆密钥,这可能是合理的,具体取决于您要完成的任务。在这种情况下,您可以在代码中的各个位置隐藏密钥密码,并使用您提到的 KeyStore。这不是很安全,但对于您的目的来说可能“足够好”。

任何分发给最终用户的密钥都不能被视为秘密。

更重要的是,如果您的服务器信任 任何 客户端代码,无论是否签名,您的服务器都可能存在安全问题。您必须找到一种不同于信任客户端的方式来强制执行您的安全属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2013-12-04
    • 2010-11-14
    相关资源
    最近更新 更多