如何在代码中安全地存储私钥

时间:2010-01-12 16:05:15

标签: java cryptography obfuscation

我正在开发一个软件项目,其中应用程序最终将在不受信任的环境中运行。我需要执行一些辅助加密签名(这意味着这不是保护数据的主要方法),但不希望将密钥保留在普通视图中:

private static final String privateKey = "00AABBCC....0123456789";

我可以用什么方法来合理地保护这个?我知道没有什么是完整的证明,但这将在安全墙中添加一个额外的层。

澄清一下:我有一个本质上是一个字符串,我不希望在调试器中或通过反射很容易地将其拉出。我知道类文件的反编译本质上可能会造成这种风险,但这是一种可接受的风险。

显然,将密钥存储在异地非常理想,但我无法保证能够访问互联网。

5 个答案:

答案 0 :(得分:5)

在不受信任的环境中保护密钥是不可能的。您可以对代码进行模糊处理,也可以从任意变量创建密钥。最后,假设您使用标准javax.crypto库,则必须调用Mac.getInstance(),稍后您将在该实例上调用init()。想要你的钥匙的人会得到它。

但是,我认为解决方案是将密钥绑定到环境,而不是程序。签名意味着数据源自已知来源,并且由于该来源提供而未被篡改。目前,您试图说“保证我的程序生成数据”。相反,将您的要求更改为“保证我的程序的特定用户生成数据”。然后责任转移给该用户以照顾他/她的钥匙。

答案 1 :(得分:1)

忘记在代码中隐藏它。它只会使您的软件更难以阅读,调试和维护。如果您的软件必须通过安全审核,您也会被钉死。

如果您无法将密钥放入安全存储区(安全地存放在磁盘,安全内存或某人的密码短语中),请不要再烦恼。

如果您处于* nix环境中,将密钥存储在具有root / root 400权限的磁盘上可能“足够好”。

在Windows上,您可以使用DPAPI将数据存储在Microsofts安全内存中。

您还可以使用轻量级PBE加密敏感密钥,并让用户在应用程序启动时输入密码。

答案 2 :(得分:0)

那是谁的私钥?私钥应该是私有的,因此分发它是错误的。

答案 3 :(得分:0)

首先关闭 - 想你这个问题就好了!

是否可以生成私钥,与证书颁发机构通信并让密钥签名(并管理CRL)?

作为替代方案,如果要在Windows上运行,您可以使用加密API安全地存储标记为不可导出的私钥。如何安全地分发该密钥可能是另一项挑战。

答案 4 :(得分:0)

你能否将私钥分成两部分:在程序中存储一个私钥,然后以交互方式请求下半部分 - 当你的应用程序启动时?