在今年 DEFCON 的问答环节中,一位观众提到我们在散列之前连接随机值和密码时使用了“假盐”。他将“真正的盐”定义为原始 Unix crypt 实现中所见的东西,它改变了算法的运行方式,因此需要使用不同的代码来破解每个密码并极大地困扰 GPU 攻击。
“真”和“假”盐的讨论有什么好处吗?
在今年 DEFCON 的问答环节中,一位观众提到我们在散列之前连接随机值和密码时使用了“假盐”。他将“真正的盐”定义为原始 Unix crypt 实现中所见的东西,它改变了算法的运行方式,因此需要使用不同的代码来破解每个密码并极大地困扰 GPU 攻击。
“真”和“假”盐的讨论有什么好处吗?
是的,有一个有效的区分;您需要一位密码学家来告诉您差异有多大意义。
您所描述的“真正的盐”用于“扰乱加密算法”。我模糊地理解这一点,但还不足以正确描述。可以这么说,使用真正的盐,原始密码文本被加密但输出不同,具体取决于算法如何结合盐输入(该算法具有(至少两个)输入,盐和(分别)原始密码文本)。
“假盐”涉及在使用加密算法对其进行加密之前使用盐修改原始密码文本。例如,如果我的密码是“nezperce”,而我的 salt 是“qp”,那么算法将交给修改后的密码文本“qpnezperce”进行编码。如果 Alice 也尝试使用密码“nezperce”,但有盐“w4”,那么算法将为她编码修改后的密码文本“w4nezperce”。结果,即使我们都使用相同的密码,她的加密哈希也会与我的不同。
这两种方法都提供了盐的主要好处。以确保相同的密码并不总是以相同的方式加密。使用盐增加了安装预先计算的哈希攻击的难度(以前我说字典或蛮力攻击,请参阅评论)。
我相信使用“真正的盐”还有其他优点,例如增加计算开销(这会减慢攻击速度)。但是,再一次,你需要一个比我更有加密技能的人才能知道这是否属实。
我认为“假盐”的优势在于它更容易实现并且需要更少的加密知识。我知道我最常看到假盐的地方是管理自己的身份验证数据库的 Web 应用程序。
正如 Thomas 所指出的,仅将盐作为对散列算法的修改的一般概念实际上并不能从根本上为您提供任何额外的保护。它可能要求攻击者调整现有的软件和硬件攻击,但如果您真的不知道自己在做什么,它也会给您带来麻烦。
但是他们错过了关于加盐的原始论文中的另一个旧创新——通常称为“胡椒”:作为实现的一部分的自定义密钥,而不是与密码一起存储。我参考了 Morris 和 Thompson 在他们的开创性 Unix 论文中介绍该概念的方式,在Password Hashing 的讨论中添加盐 + 胡椒或盐就够了吗?
辣椒的优点是您可以将它与盐结合使用,这样即使有人窃取了密码数据库(确实有盐),他们也需要窃取辣椒(可能并入应用程序或散列库代码或存储在完全独立的系统上)来破解密码。在许多情况下,这不会更难,但在某些情况下,它可能会更难。
不熟悉原始 Unix crypt 实现的细节。但这对我来说似乎没有任何意义。尤其是首先考虑加盐密码的目的是什么。我认为,如果使用盐会改变您的算法以使其“更强大”,那么您首先使用的是错误的算法。