如何加密存储在数据库中的密码(稍后需要解密)

信息安全 加密
2021-09-01 00:28:15

我正在开发一个可以连接到任意数量的不同系统的系统。有人输入了要连接的系统的凭据,我的系统会记住这些凭据,并在以后使用它们进行身份验证并与之通信(这将在没有用户交互的情况下发生)。

像这样的所有其他问题的答案都是“散列散列!”,但您可以看到散列对我不起作用,因为我需要稍后解密密码才能连接到其他系统(与我无关)。

现在我在想我应该为每个新系统动态生成一个随机密钥并将其存储在磁盘上,然后将密码(使用对称算法加密)存储在数据库中。这样,仅数据库中的信息不足以解密密钥。

这是我能做的最好的吗?

2个回答

如果您连接的系统只能接受密码作为凭证,那么您是正确的。如果这就是远程系统的工作方式,那么不幸的是,它是被设计的,如果可能的话,应该扩展它以接受其他类型的令牌。更合适的令牌示例是 Kerberos 票证、SSH 密钥、OpenID 凭证或其他自定义的每个应用程序凭证。

所有好的身份验证解决方案都有一个共同点:它们允许用户授权您代表他们进行连接,而无需向您提供他们的凭据。一个好的系统可以让我的行政助理代我购买机票。它不需要我的管理员冒充我。

但是,如果远程系统设计不佳并且不能接受这种委托凭证,那么您别无选择,只能存储密码。在这种情况下,传统的做法是使用某种“加密密钥和算法”来混淆数据库中的密码。(例如,AES 根据存储在磁盘上的密钥对密码进行加密。)这不应与真正的加密相混淆。这只是混淆。但如果您没有其他选择,它可能是有用的混淆。

比存储在磁盘上的单个密码更好的解决方案是为您执行解密的硬件密钥。这种设备通常称为硬件安全模块,通常采用智能卡的形式(有时它是完整的机架安装设备、电路板或 USB 密钥)。您向 HSM 提供加密的密码,它会将未加密的密码交还给您。这种方法的优点是,如果有人克隆了您的磁盘,他们仍然无法解密密码。HSM 很难物理克隆,这使得攻击者更难在不被发现的情况下窃取凭据。在最好的设计中,与 HSM 对话的进程有一个在启动时手动输入的凭证,并且只存储在内存中。所以随机进程无法查询 HSM,如果机器被拔掉,它就无法再访问密码。

您应该从系统上的用户密码生成一个加密密钥。

这样,除非他们已经拥有用户的密码,否则没有人可以看到任何密码。

但是,这意味着您无法重置用户密码。