我正在开发一个软件项目,其中应用程序最终将在不受信任的环境中运行。我需要执行一些辅助加密签名(这意味着这不是保护数据的主要方法),但不希望将密钥保留在普通视图中:
private static final String privateKey = "00AABBCC....0123456789";
我可以用什么方法来合理地保护这个?我知道没有什么是完整的证明,但这将在安全墙中添加一个额外的层。
澄清一下:我有一个本质上是一个字符串,我不希望在调试器中或通过反射很容易地将其拉出。我知道类文件的反编译本质上可能会造成这种风险,但这是一种可接受的风险。
显然,将密钥存储在异地非常理想,但我无法保证能够访问互联网。
答案 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)
你能否将私钥分成两部分:在程序中存储一个私钥,然后以交互方式请求下半部分 - 当你的应用程序启动时?