PHP - MD5,SHA,Hashing安全性

时间:2013-02-07 13:35:22

标签: php security hash md5 sha1

我是一个用PHP构建的新网站的开发者,我想知道究竟什么是最好的 用于散列的东西。我看过md5和sha1,但还有什么更安全的 我很抱歉,如果这是一个不起眼的问题,但我是PHP安全新手,我正在尝试制作我的 网站尽可能安全。什么是盐?
谢谢,
瓦西姆

3 个答案:

答案 0 :(得分: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 a 密码是(注意更多可自定义,你需要看到这个How do you use bcrypt for hashing passwords in PHP?):

crypt($password, $salt);

现在回答你的第二个问题。盐通常是您在末尾添加的随机字符串  哈希它们时的所有密码。使用salt意味着某人获取您的数据库 他们无法检查常用密码的哈希值。使用彩虹表调用数据库。散列时应该总是使用盐!!

以下是我对SHA1和MD5冲突攻击漏洞的证明:
http://www.schneier.com/blog/archives/2012/10/when_will_we_se.htmlhttp://eprint.iacr.org/2010/413.pdfhttp://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdfhttp://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdfUnderstanding sha-1 collision weakness

答案 1 :(得分:1)

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

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

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

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

如果您要生成的哈希值用于密码,则这是一种广为接受的实现方法。

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

答案 2 :(得分:0)

如果您计划对密码执行此操作,则不要使用MD5或SHA1 。众所周知,即使用盐,它们也会变得脆弱和不安全。

如果您将它们用于其他目的(例如,提供文件的散列以确认其真实性,或者随机散列数据库列以提供伪随机排序顺序)那么它们就可以了(直到某一点) ,但不是密码或其他任何你认为需要保密的东西。

密码哈希的当前最佳实践算法是BCrypt,具有适当的salting。

在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会为你处理盐析。

希望有所帮助。