但是,如果角色互换了,而您的应用程序是需要向另一个应用程序提供密码的应用程序,该怎么办? 例如,您的Web应用程序必须先通过数据库服务器进行身份验证,然后才能检索数据。
这样的凭证称为出站密码 。
出站密码必须存储在某个地方
出站密码必须像其他任何密码一样对待。 例如,它们必须与任何密码一样强 。
但是关于密码的通常建议有一个例外: 必须以某种方式记录出站密码。 您不能指望有人在您的Web应用程序每次连接到数据库服务器时都输入密码。
这就引出了一个问题:我们应该如何记录出站密码。
在代码中存储出站密码是一个坏主意
首先想到的是将出站密码简单地存储在源代码中。 这是一个坏主意。
通过访问源代码,可以使用grep
类的工具轻松找到密码。 但是,即使访问二进制代码,也使攻击者有很大的机会找到密码。 诸如javap
工具产生的输出可以轻松地遍历所有字符串。 而且由于密码必须足够强,因此攻击者可以只专注于熵最大的字符串,然后尝试将其作为密码。
更糟的是,一旦硬编码密码遭到破坏,就无法在不修补代码的情况下从漏洞中恢复!
解决方案#1:将加密的出站密码存储在配置文件中
因此,出站密码必须存储在代码之外,并且代码必须能够读取它。 那么,最合乎逻辑的地方是将其存储在配置文件中 。
为了防止攻击者读取出站密码,必须使用强大的加密算法 (例如AES)对其进行加密。 但是现在,我们面临着同一问题的不同版本:应用程序如何存储加密密钥?
一种选择是将加密密钥存储在单独的配置文件中,并对其设置更严格的权限。 这样,大多数管理员将无法访问它。 这种方案当然不是100%安全的,但是至少它将阻止偶然的攻击者。
一个更安全的选择是使用密钥管理服务,可能基于密钥管理互操作性协议 (KMIP)。
在这种情况下,加密密钥不会与应用程序一起存储,而是存储在单独的密钥存储区中 。 KMIP还支持在发生违规时撤销密钥。
解决方案2:在启动过程中提供出站密码
更加安全的解决方案是仅将出站密码存储在内存中。 这要求管理员在应用程序启动时提供密码。
您甚至可以更进一步,使用拆分密钥方法,其中多个管理员各自提供密钥的一部分,而没人知道整个密钥。 PCI DSS标准中推广了这种方法。
与在配置文件中存储加密密钥相比,在启动时提供密钥可能更安全,但是这样做有一个很大的缺点:它会阻止自动重启。 人类完全参与的事实使这种方法在云环境中不切实际。
创建出站密码
如果您的应用程序可以控制需要连接到的外部系统,则它可以确定出站密码,就像用户为应用程序定义其密码一样。
例如,在多租户环境中, 租户的数据可能存储在单独的数据库中,并且您的应用程序在创建密码时可以为每个密码选择一个出站密码。
创建的出站密码必须足够强。 一种实现方法是使用随机字符串,并使用来自不同字符类的字符。 另一种方法是Diceware 。
确保使用良好的随机数生成器 。 例如,在Java中,首选SecureRandom
不是普通的Random
。
翻译自: https://www.javacodegeeks.com/2012/09/outbound-passwords.html