有什么好处
sha1(sha1(sha1($password. $salt)));
基本上有多个sha1经文只有一个sha1
sha1($password. $salt);
答案 0 :(得分:9)
不要,我再说一遍,不要尝试通过执行“特殊”操作来使您的密码哈希更安全。
首先,sha1(sha1(sha1($input)))
仅对每次迭代的增加碰撞机会 * 产生副作用。增加碰撞的机会是一件非常糟糕的事情。
为什么不相信由该领域的实际专家制作的图书馆,而不是亲自动手做自己的密码学?使用Portable PHP password hashing framework。
PHPass实际上使用 bcrypt ,这是一种旨在防止彩虹表,字典和暴力攻击的算法。您可以使用多个轮次对其进行初始化:轮次越高,计算哈希值所需的时间越长。这样,如果处理能力增加,您可以创建更强的哈希值。
* 第一次调用sha1()
需要无限输入,并从2
160
输出中创建一个。第二次迭代采用2
160
输入并创建x
个输出中的一个,其中x <= 2
160
。第三次迭代采用x
输入并创建y
个输出中的一个,其中y <= x <= 2
160
。
为什么每次拨打sha1()
都会减少可能的输出量?因为sha1()
背后的算法不是为哈希的一对一匹配而设计的。从理论上讲,如果你要散列每个可能的哈希值,你肯定会发生冲突。
答案 1 :(得分:2)
是的,这被称为key strengthening(但通常会进行数千次),并且应该在每次迭代时附加盐以获得更好的熵:
$hash = sha1($password . $salt);
for ($i = 1; $i <= 65000; ++$i)
{
$hash = sha1($hash . $salt);
}
另外,read this awesome blog post - 或至少这个简短的引用:
您可以更好地优化您的 密码哈希函数,速度更快 你的密码哈希函数得到了, 你的计划越弱。 MD5和SHA1, 甚至像传统的分组密码一样 DES,设计得很快。 MD5, SHA1和DES是弱密码 哈希值。在现代CPU上,原始加密 像DES和MD5这样的构建块可以 比特,矢量化和 并行化以进行密码搜索 闪电快。游戏结构FPGA 实现只需几百个 元。
使用原始哈希函数对密码进行身份验证非常简单 使用未加盐的哈希函数。 没有。
这里的最新技术是什么?
首先,你的操作系统是什么 已经给你:密码方案 “优化”是计算上的 昂贵。其中最着名的是 PHK的FreeBSD MD5方案。
PHK计划之间的区别 以及你将要使用的那个 你的社交购物车2.0 应用很简单。你是公正的 在盐和a上运行MD5 密码并存储哈希值。的 PHK 运行MD5进行数千次迭代。 这就是所谓的“拉伸”。
答案 2 :(得分:1)
简短的回答是否定的。当您链接两个哈希算法时,您所做的只是创建另一个具有未知属性的哈希算法(安全性)。使用盐(甚至更好,HMAC)。
答案 3 :(得分:0)
它必须经历散列过程的次数越多,散列所需的时间越长,攻击者每天尝试的次数就越少。如果散列一次需要10毫秒,并且将其散列10次需要100毫秒,那么攻击者可以每分钟尝试6000个密码并对其进行一次散列,每分钟600次并散列十次。当然,对于Web应用程序,尝试以每分钟6000或600的速度暴力本质上是DOS攻击。为此目的,加密哈希往往需要一段时间才能完成,并且多次哈希也很常见。
你应该使用sha512而不是sha1,你可以用hash()
来做hash('sha512',$stringtobehashed);
,sha512也比sha1长5倍左右。