从本质上讲,这是一个关于控制的问题。您想控制对这个 KeyStore 文件的访问,以便只有您的应用程序可以访问它,而其他人不能。您不希望对此设置太少的控制,因为这会带来未经授权的访问的可能性。您也不想对此进行太多控制,因为那样使用起来太麻烦且太昂贵。
要允许应用程序而不是其他应用程序访问其 KeyStore,您需要使应用程序能够断言身份。
您有以下选择:
- 将 KeyStore 的密码放在配置文件中,并让应用程序在启动时读取它。这允许您通过操纵文件系统权限来控制应用程序实例的身份(应用程序用户可以读取,但不能写入,其他任何人都无法读取)。如果您的 KeyStore 仅基于 KeyStore 文件,请考虑将 OS 权限控制放在 KeyStore 文件上并完全取消密码短语。如果您的对手可以冒充您的应用程序用户,那么他们在您的系统上有根,您将遇到更大的问题。
- 当应用程序启动时,在应用程序加载 KeyStore 之前,让某人在控制台上键入 KeyStore 的密码。这显然完全属于“繁琐”的类别:它阻止了自动启动,并且可能通过贿赂必须知道密码的人而受到攻击。
- 使用硬件安全模块 (HSM) 来支持密钥库,因此在使用密钥之前,必须将破坏应用程序服务器上的文件系统安全性与对托管设施的物理攻击相结合。对于用于登录 HSM 的凭据的安全性,考虑与上述相同。这就是我必须透露我以销售 HSM 为生的地方。
- 将 HSM 与 HSM 强制访问控制结合使用,以便多个操作员必须提供硬件凭据(智能卡)并在系统控制台上键入密码,然后才能启动应用程序。这是“繁琐”的远端,但它可以防止上面 2. 中的贿赂问题。
请注意,这些都不是基于添加加密层:这都是关于根据应用程序实例的身份或一个或多个操作员的授权对 KeyStore 内容的访问实施控制。
最后,这一切都取决于私钥的重要性,以及私钥丢失或泄露时的后果。根据您对风险和后果的评估,使用哪些控制措施应该是一项业务决策。