如何在不对密钥进行硬编码的情况下使用 Java 解密数据?

信息安全 密码学 加密 视窗 爪哇 文件加密
2021-09-02 10:45:58

我希望这不是鸡蛋问题或重新发明轮子,但这里是这样。
我有一个 Java 应用程序需要访问受密码保护的文件(实际上是在应用程序启动期间)。
应该访问的受密码保护的文件的路径在配置文件中,encrypted密码也在此配置文件中。
所以问题是如何解密加密的密码才能访问文件?
我可以在我的代码中硬编码解密密钥并能够解密它。
临:

  • 有用

缺点:

  1. 由于代码没有被混淆(不能因为各种原因),所以我不能使用它并且可以找到解密密钥
  2. 密码无法更改,因为解密将硬编码到应用程序

注意:我主要关心(1);(2)是需要的,但对我来说不需要。

那么有没有一个好的/标准的方法呢?

任何输入都受到高度赞赏。

4个回答

你需要存储一个“密码”(或密码才能解密密码或密码才能解密密码解密密码等循环往复),某处。

所以,要么你可以存储它

  • 在计算机上,但随后可以对其进行反混淆和读取(如果您的程序可以做到,任何程序都可以做到)
  • 或在用户的脑海中(以编程方式更难理解,但有自己的一系列问题 - 12345,便利贴等)
  • 或在用户随身携带的设备中(可能会丢失/被盗,更昂贵)

根据您要保护的内容(银行保险库或笑脸猫图片?),这些方法可以组合或单独使用。除了密码强度之外,您还应该考虑加密强度 - “在后面有窗户的花园棚子上使用金库门没有意义”。

从本质上讲,这是一个关于控制的问题。您想控制对这个 KeyStore 文件的访问,以便只有您的应用程序可以访问它,而其他人不能。您不希望对此设置太少的控制,因为这会带来未经授权的访问的可能性。您也不想对此进行太多控制,因为那样使用起来太麻烦且太昂贵。

要允许应用程序而不是其他应用程序访问其 KeyStore,您需要使应用程序能够断言身份。

您有以下选择:

  1. 将 KeyStore 的密码放在配置文件中,并让应用程序在启动时读取它。这允许您通过操纵文件系统权限来控制应用程序实例的身份(应用程序用户可以读取,但不能写入,其他任何人都无法读取)。如果您的 KeyStore 仅基于 KeyStore 文件,请考虑将 OS 权限控制放在 KeyStore 文件上并完全取消密码短语。如果您的对手可以冒充您的应用程序用户,那么他们在您的系统上有根,您将遇到更大的问题。
  2. 当应用程序启动时,在应用程序加载 KeyStore 之前,让某人在控制台上键入 KeyStore 的密码。这显然完全属于“繁琐”的类别:它阻止了自动启动,并且可能通过贿赂必须知道密码的人而受到攻击。
  3. 使用硬件安全模块 (HSM) 来支持密钥库,因此在使用密钥之前,必须将破坏应用程序服务器上的文件系统安全性与对托管设施的物理攻击相结合。对于用于登录 HSM 的凭据的安全性,考虑与上述相同。这就是我必须透露我以销售 HSM 为生的地方。
  4. 将 HSM 与 HSM 强制访问控制结合使用,以便多个操作员必须提供硬件凭据(智能卡)并在系统控制台上键入密码,然后才能启动应用程序。这是“繁琐”的远端,但它可以防止上面 2. 中的贿赂问题。

请注意,这些都不是基于添加加密层:这都是关于根据应用程序实例的身份或一个或多个操作员的授权对 KeyStore 内容的访问实施控制。

最后,这一切都取决于私钥的重要性,以及私钥丢失或泄露时的后果。根据您对风险和后果的评估,使用哪些控制措施应该是一项业务决策。

你保护这个文件是针对谁的?

如果针对以相同或更少权限运行的进程,则 ajava.security.KeyStore应该允许用户授权您的进程使用他们选择的密码访问密钥。您仍然需要为该授权提示建立可信路径。

如果您试图防止以超级用户身份运行的进程或能够拦截整个窗口系统的 UI 事件,那么您必须放弃受密码保护的密钥库。

由于密码保护的是用户的私钥,所以在使用私钥之前,必须确保用户授权使用。确保用户授权访问的最合乎逻辑的方法是要求他们输入密码。所以很难理解这怎么会成为一个问题。