6

我是一个用 PHP 构建的新网站的开发人员,我想知道最适合用于散列的东西是什么。我看过 md5 和 sha1 ,但有什么更安全的。
对不起,如果这是一个小问题,但我是 PHP 安全的新手,我正在努力使我的网站尽可能安全。还有什么是盐?
谢谢,
瓦西姆

4

3 回答 3

9

首先,md5 和 sha1 已被证明可以抵抗碰撞攻击,并且可以很容易地进行彩虹表(当他们看到您的哈希值在他们的常用密码数据库中是否相同时)。
目前有两件事对密码来说足够安全,您可以使用。
第一个是sha512。sha512 是 SHA2 的子版本。SHA2 尚未被证明可以抵抗碰撞攻击,sha512 将生成 512 位散列。以下是如何使用 sha512 的示例:

<?php
hash('sha512',$password);

另一个选项称为 bcrypt。bcrypt 以其安全散列而闻名。它可能是目前最安全的一种,也是最可定制的一种。
在您想开始使用 bcrypt 之前,您需要检查您的服务器是否启用了它,输入以下代码:

<?php
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
    echo "CRYPT_BLOWFISH is enabled!";
}else {
echo "CRYPT_BLOWFISH is not available";
}

如果它返回它已启用,那么下一步很简单,您需要做的就是 bcrypt 密码(注意更多可定制性,您需要查看此How do you use bcrypt for hashing passwords in PHP?):

crypt($password, $salt);

现在回答你的第二个问题。盐通常是一个随机字符串,当你对它们进行哈希处理时,你在所有密码的末尾添加它。使用盐意味着如果有人获取了您的数据库,他们将无法检查散列以获取常用密码。使用彩虹表调用检查数据库。哈希时应始终使用盐!

以下是我对 SHA1 和 MD5 碰撞攻击漏洞的证明:
http ://www.schneier.com/blog/archives/2012/10/when_will_we_se.html,http : //eprint.iacr.org/2010/413.pdf , http://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdf , http://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdf了解 sha-1 碰撞弱点

于 2013-02-07T13:39:06.210 回答
1

salt 的全部目的是减缓攻击者将预先生成的哈希列表与目标哈希进行比较的速度。

攻击者不需要为每个明文密码预先计算一个“散列”值,而是需要为每个明文密码 (2^7 * 2^7) 预先计算 16384 个“散列”值。

这在今天有点相形见绌,但在第一次开发 crypt 函数时相当大 - 预先计算许多密码乘以您怀疑(字典)的明文密码数量的计算能力非常高。

今天没有那么多,这就是为什么我们有影子密码、除 crypt 之外的其他核心密码功能以及每个 sysad 都希望你选择一个不会出现在字典中的密码的原因。

如果您要生成的散列用于密码,这是一种被广泛接受的实现方法。

http://www.openwall.com/phpass/

于 2013-02-07T13:43:21.803 回答
0

如果您打算对密码执行此操作,请不要使用 MD5 或 SHA1。众所周知,即使加盐,它们也很虚弱和不安全。

如果您将它们用于其他目的(例如,提供文件的哈希以确认其真实性,或提供随机哈希数据库列以提供伪随机排序顺序),那么它们很好(在一定程度上),但不是用于密码或您认为需要保持安全的任何其他内容。

当前密码拥有的最佳实践算法是 BCrypt,具有适当的加盐。

而在 PHP 中实现 BCrypt 密码散列的最佳方法是使用 PHP 的新密码 API。该 API 将作为一组内置函数出现在 PHP 的下一个版本 v5.5 中,该版本将在未来几个月内发布。好消息是他们还为当前 PHP 版本(5.3 和 5.4)的用户发布了向后兼容版本,因此即使 PHP 5.5 尚未发布,您也可以立即开始使用新的 API。

您可以从这里下载兼容性库:https ://github.com/ircmaxell/password_compat

另外:你问什么是“盐”。既然我在这个答案中提到过几次,我也应该解决这部分问题。

Salt基本上是在对密码进行哈希处理时添加到密码中的附加字符串,以使其更难破解。

例如,攻击者可能提前知道给定密码字符串的散列值是什么,甚至是一大堆给定密码字符串。如果他可以掌握您的散列数据并且您没有使用盐,那么他可以将您的散列与他的已知密码列表进行比较,如果您的任何用户使用容易猜到的密码,他们将是无论使用什么散列方法,都可以在几秒钟内破解。

但是,如果您在对密码进行哈希处理时添加了一个秘密的额外字符串,那么哈希值将与原始密码的标准哈希值不匹配,从而使攻击者更难找到该值。

好消息是,如果您使用的是我上面提到的 API,那么您不必太担心这方面的细节,因为 API 会为您处理加盐。

希望有帮助。

于 2013-02-07T13:47:03.060 回答