我想知道为什么PHP的hash_password函数使用河豚而不是三条鱼。据布鲁斯·施耐尔( Bruce )说,河豚已经过时了,他推荐双份或三份。河豚够安全吗?三重安全只会减慢登录认证的速度吗?
发布于 2016-01-11 18:14:42
PHP使用bcrypt作为password_hash(),但是由于PHP是PHP,所以他们必须最大限度地混淆,因此他们称其为"Blowfish“。
在20多年前,除了是剧毒鱼的一家外,龙虾也是一种分组密码。Bcrypt是一种密码哈希函数,它恰好是从内部块密码中派生出来的,类似于Blowfish --但它用于完全不同于块密码的用途,即加密。
三重是另一个块密码,它是后来为另一个目的而设计的,也就是鱼叉哈希函数的设计。现在请注意,因为这是一个棘手的问题。“哈希函数”和“密码哈希函数”是完全不同的东西。尽管它们在名称上有相似之处,但它们是非常不同的野兽,它们接受不同的输入,产生不同的输出,并具有非常不同的安全性要求和特性。
Threefish被设计为块密码,原因有很多,其中主要的原因是需要大块(512位或更多),因为您需要大块来生成一个能够抵抗冲突的散列函数。然而,碰撞与密码哈希完全无关,Blowfish的短块大小(64位)对bcrypt来说不是问题。
作为块密码器,Threefish在许多方面比Blowfish“更好”(更大的块,更快,可以不用表实现.)。作为散列函数的构建块,Threefish同样优于Blowfish,但在不同的方面。作为密码散列函数的构建块,Threefish实际上比Blowfish更糟糕,其原因与Threefish比Blowfish更适合散列函数的原因相同;特别是,Threefish可以在没有表的情况下实现。这意味着Threefish允许在GPU上进行彻底优化的并行实现,这在一般情况下是好的,对密码哈希非常不利。
所有这些都不能真正解释为什么PHP没有“切换到Threefish”。这正好说明了为什么这样的转变会是个坏主意。
发布于 2016-01-11 16:41:39
PHP的密码_哈希使用bcrypt散列函数。这是接近最先进的密码存储,也许氪石是它的后继者。
虽然您没有提供Schneier(未更正拼写)注释的链接,但我怀疑他是在谈论河豚加密算法。虽然bcrypt是以河豚为基础的,但它并没有类似的弱点。
发布于 2016-01-11 16:44:10
目前,password_hash被设计成与crypt()兼容,后者支持有限的哈希算法。在支持的算法中,Blowfish是唯一的加密算法:
任何其他函数都可以很容易地包含在PHP中,但是会导致无法使用crypt验证的散列。
https://security.stackexchange.com/questions/110282
复制相似问题