出站密码

有关如何安全存储密码的文章很多 。 这种建议可以解决常见的情况,即您的用户向您的应用程序显示密码以获取访问权限。

但是,如果角色互换了,而您的应用程序是需要向另一个应用程序提供密码的应用程序,该怎么办? 例如,您的Web应用程序必须先通过数据库服务器进行身份验证,然后才能检索数据。

这样的凭证称为出站密码

出站密码必须存储在某个地方

出站密码必须像其他任何密码一样对待。 例如,它们必须与任何密码一样

但是关于密码的通常建议有一个例外: 必须以某种方式记录出站密码。 您不能指望有人在您的Web应用程序每次连接到数据库服务器时都输入密码。

这就引出了一个问题:我们应该如何记录出站密码。

在代码中存储出站密码是一个坏主意

首先想到的是将出站密码简单地存储在源代码中。 这是一个坏主意。

通过访问源代码,可以使用grep类的工具轻松找到密码。 但是,即使访问二进制代码,也使攻击者有很大的机会找到密码。 诸如javap工具产生的输出可以轻松地遍历所有字符串。 而且由于密码必须足够强,因此攻击者可以只专注于最大的字符串,然后尝试将其作为密码。

更糟的是,一旦硬编码密码遭到破坏,就无法在不修补代码的情况下从漏洞中恢复!

解决方案#1:将加密的出站密码存储在配置文件中

因此,出站密码必须存储在代码之外,并且代码必须能够读取它。 那么,最合乎逻辑的地方是将其存储在配置文件中

为了防止攻击者读取出站密码,必须使用强大的加密算法 (例如AES)对其进行加密。 但是现在,我们面临着同一问题的不同版本:应用程序如何存储加密密钥?

一种选择是将加密密钥存储在单独的配置文件中,并对其设置更严格的权限。 这样,大多数管理员将无法访问它。 这种方案当然不是100%安全的,但是至少它将阻止偶然的攻击者。

一个更安全的选择是使用密钥管理服务,可能基于密钥管理互操作性协议 (KMIP)。

在这种情况下,加密密钥不会与应用程序一起存储,而是存储在单独的密钥存储区中 。 KMIP还支持在发生违规时撤销密钥。

解决方案2:在启动过程中提供出站密码

更加安全的解决方案是仅将出站密码存储在内存中。 这要求管理员在应用程序启动时提供密码。

您甚至可以更进一步,使用拆分密钥方法,其中多个管理员各自提供密钥的一部分,而没人知道整个密钥。 PCI DSS标准中推广了这种方法。

与在配置文件中存储加密密钥相比,在启动时提供密钥可能更安全,但是这样做有一个很大的缺点:它会阻止自动重启。 人类完全参与的事实使这种方法在环境中不切实际。

创建出站密码

如果您的应用程序可以控制需要连接到的外部系统,则它可以确定出站密码,就像用户为应用程序定义其密码一样。

例如,在多租户环境中, 租户的数据可能存储在单独的数据库中,并且您的应用程序在创建密码时可以为每个密码选择一个出站密码。

创建的出站密码必须足够强。 一种实现方法是使用随机字符串,并使用来自不同字符类的字符。 另一种方法是Diceware

确保使用良好的随机数生成器 。 例如,在Java中,首选SecureRandom不是普通的Random

参考: 安全软件开发博客中来自JCG合作伙伴 Remon Sinnema的出站密码


翻译自: https://www.javacodegeeks.com/2012/09/outbound-passwords.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值