是否可以使用可逆加密安全地存储密码?

信息安全 密码学 密码
2021-08-20 11:08:19

大家都说在存储密码的时候需要使用不可逆的哈希,这样即使你的数据库泄露了,密码本身还是安全的。我想知道是否无论如何都可以使用可逆加密来存储密码。

至少,您需要要求任何泄露数据库的漏洞(SQL 注入、服务器外壳访问等)都不会泄露加密密钥,并且无法合理地使用如果你有泄露的数据库,一个已知的明文密码。

我没有认真考虑这样做,因为即使在技术上可行,也很难正确地做到这一点,但这似乎是一个有趣的问题。

4个回答

可逆加密不常用于密码,因为密码认证的具体要求和参数与可逆加密的弱点不兼容。

可逆加密的主要弱点很简单:如果密钥被泄露,加密的数据就会被泄露。

每当用户登录时,始终使用密码。因此,身份验证过程必须能够始终以自动方式访问用户的凭据,而不受阻碍性控制。这意味着可逆加密的密钥需要一直在磁盘或内存中。如果该程序、磁盘或内存以某种方式受到损害,那么所有这些可逆加密的密码都会一举受到损害。

相反,考虑使用不可逆哈希。如果程序、磁盘或内存被破坏,那么攻击者就会获得“锁定”的哈希值,并且没有密钥。然后他们可以进一步攻击——已知的密文攻击、暴力破解等——但他们还没有“获胜”。

我们确实一直在使用可逆(让我说是密钥)加密——磁盘、文件、电子邮件附件。然而,这些用途的共同点是它们鼓励(如果不需要)人工干预来提供密钥。

我不确定您为什么要问这个问题,但是混合模型呢?考虑为用户密码存储可逆和不可逆密文可能是合理的。创建密码时,存储两个加密版本:一个使用单向散列函数创建,另一个使用非对称加密算法(“公钥加密”)创建。所有自动身份验证过程都使用不可逆散列进行身份验证。将“公钥”对的一半保留在系统上,用于生成加密密码,并将“私钥”对的一半离线存储. 如果需要密码明文,请将加密密码脱机并使用适当的密钥对其进行解密。只要身份验证系统无法访问解密密钥,攻击者就无法利用您使用“可逆”加密来存储明文密码这一事实。

当然,只有当您需要访问纯文本密码不是自动需要时,这才会有所帮助。但这对我来说似乎是一个绝妙的主意。

是否可以使用可逆加密安全地存储密码?

是的,但要困难得多,需要更大的努力和费用。键控很难做好。

为了支持可逆加密(不一定像@goenfawr 注释那样对称),您至少需要一个密钥(两个用于公钥加密)。您需要生成密钥、安全地存储它、保护它免受损坏或破坏、检索它以供使用、在使用时保护它并定期更换它。

问题的一个重要部分是如何在不使用时保护密钥。如果您加密密钥,那么您需要另一个密钥来解密它。在这种情况下,你又回到了你开始的地方。其他保护方法使用特殊硬件或安全操作系统,甚至使用具有单独内存和处理器的定制计算机来获取安全参数。所有这些解决方案都需要额外的培训和支持成本。

将这些解决方案与使用零售计算机、零售操作系统和散列函数进行比较。

添加到现有答案的一件事是,可以使用对称(可逆)加密来存储秘密(包括密码),但它有点复杂/昂贵。

一个很好的例子是 ATM/Cash 机器网络,它传统上使用对称密钥管理(尽管他们正在将其转移到基于 PKI 的解决方案上)。

关键(没有双关语)是加密密钥存储在受信任的位置,在这种情况下,需要遵循硬件安全模块 (HSM) 和与密钥加载和管理相关的严格程序,以确保密钥保持不变秘密。

查看密码的 wiki 页面。尽管有许多安全密码,但始终存在泄露密钥的风险。使用单向哈希通过没有密钥来避免这种风险。

安全工程的一个原则是在系统受到威胁的情况下最大限度地减少可获得的信息。