有什么优势呢?
sha1(sha1(sha1($password. $salt)));
基本上,拥有多个 SHA1 与只有一个 SHA1 相比
sha1($password. $salt);
有什么优势呢?
sha1(sha1(sha1($password. $salt)));
基本上,拥有多个 SHA1 与只有一个 SHA1 相比
sha1($password. $salt);
sha1(sha1(sha1($ input)))
的唯一副作用是在每次迭代中增加碰撞的可能性*。增加碰撞的可能性是非常糟糕的事情。与其自己尝试加密学,为什么不信任由该领域的实际专家制作的库呢?使用{{link1:Portable PHP密码哈希框架}}。PHPass实际上使用了bcrypt,这是一种旨在防止彩虹表、字典和暴力攻击的算法。您可以使用多个轮次初始化它:轮次越高,计算哈希所需的时间就越长。这样,如果处理能力增加,您可以创建更强的哈希。
*第一次调用sha1()
时,需要无限的输入并创建2
160
个输出之一。第二次迭代需要2
160
个输入,并创建一个输出,其中x <= 2
160
。第三次迭代需要x
个输入,并创建一个输出,其中y <= x <= 2
160
。
为什么每次调用sha1()
都会减少可能的输出数量?因为sha1()
背后的算法并不是为了进行哈希的一对一匹配而设计的。理论上,如果您要哈希每个可能的哈希值,则必定会发生碰撞。
sha1($hash . $password)
),使得可能的输入变为无限,因此不会增加碰撞的机会...通常,$password
是唯一的无限输入源,除非您使用每个哈希值的 $salt
。 - Andrew Mooresha1(... sha1($ f00))
会产生越来越多的碰撞。为了看清楚,让我们把它命名为A(B(C($ foo)))
。现在,我们知道C
会有碰撞,因为无限大> 2 ^ 256。因此,所有C
的碰撞自动成为A
和B
的碰撞,因为输入未被修改。对于B
和A
也是如此。因此,总碰撞比仅针对C
要多得多。但是,如果您执行A(B(C($ foo)。$ Foo)。$ Foo)
,它将与C
具有完全相同数量的碰撞... - ircmaxellbcrypt
实际上并不会对密码进行任何迭代转换。bcrypt
重复对一个初始化向量进行转换多次,以便使用结果向量创建哈希。简单来说,它将“盐”(IV)多次转换,直到它在加密方面足够安全,从而可以生成哈希值。要将输入与bcrypt哈希进行比较,您需要存储的哈希值以提取原始IV(存储在哈希中,每个哈希都是唯一的),让bcrypt
再次转换向量,哈希原始输入,并比较两个结果哈希。 - Andrew Moorebcrypt
规范之后,它使用IV和输入来生成子密钥...不过这并不影响它发生碰撞的机会。 - Andrew Moore$hash = sha1($password . $salt);
for ($i = 1; $i <= 65000; ++$i)
{
$hash = sha1($hash . $salt);
}
hash('sha512',$stringtobehashed);
进行操作,sha512的哈希时间大约比sha1长5倍。