繁体   English   中英

PHP - MD5,SHA,Hashing安全性

[英]PHP - MD5, SHA, Hashing security

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

首先,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";
}

如果它返回它已启用,那么下一步很容易,你需要做的就是加密密码了(注意为了更多可自定义,你需要看到这个如何在PHP中使用bcrypt进行散列密码? ):

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.pdf了解sha-1碰撞弱点

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

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

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

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

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

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

如果您计划对密码执行此操作, 请不要使用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会为您处理盐析。

希望有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM