我内置在PHP中一个新的网站的开发人员,我想知道究竟是使用散列的最好的事情。 我看MD5和SHA1,但还有什么更安全。
我很抱歉,如果这是一个nooby问题,但我是新来的PHP的安全,我试图让我的网站尽可能的安全。 还什么是盐?
谢谢,
克瓦
Answer 1:
首先MD5和SHA1已被证明是vunrable碰撞攻击,并可以很容易地彩虹提交(当他们看到,如果你哈希在他们共同的密码数据库中的相同)。
目前有两件事情是对的密码足够安全,可以使用。
第一个是SHA512。 SHA512是SHA2的子版本。 SHA2尚未被证明是vunrable碰撞攻击和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一个密码(注意,你需要看到这个更多的可定制您如何使用bcrypt在PHP哈希密码? ):
crypt($password, $salt);
现在回答你的第二个问题。 盐是usally,你在你的密码的末尾添加,当你哈希他们一个随机字符串。 使用盐意味着,如果有人得到你的数据库,他们不能检查常见的密码哈希值。 检查数据库是使用彩虹表调用。 散列时,应始终使用盐!
这里是我的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/益群/ SHA1AttackProceedingVersion.pdf , http://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdf和了解SHA-1碰撞弱点
Answer 2:
盐的整个目的是攻击者从比较针对靶散列预先生成的散列的列表减缓。
代替需要预先计算一个“散列”值对于每个明文口令,攻击者需要预先计算16384“散列”值对于每个明文口令(2 ^ 7 * 2 ^ 7)。
今天有点儿相形见绌,但是,当第一次被开发crypt函数相当大 - 计算能力预先计算,许多密码明文次密码的怀疑(字典)的数量是相当高的。
这么多的不是今天这就是为什么我们有东西像影子密码,其他核心职能密码除了地下室和每一个希望的SysAD你选择一个密码,也不会在字典中出现。
如果你想生成散列口令,这是实现它的广为接受的方法。
http://www.openwall.com/phpass/
Answer 3:
如果你打算口令做到这一点,那么就不要使用MD5或SHA-1。 他们被称为弱的,不安全的,即使有盐。
如果您使用用于其他目的(如提供文件的哈希值,以确认其真实性,或随机哈希数据库列提供一个伪随机排序),那么他们的罚款(最高点),但不密码或其他任何东西,你会考虑需要被安全保存。
密码hasing目前的最佳实践算法BCrypt,用合适的盐析。
并在PHP中实现BCrypt密码哈希的最好方法是使用PHP的新密码API。 这个API将特色作为PHP,V5.5的下一个版本的一套内置功能,由于在未来几个月发布。 好消息是,他们还发布了一个向后兼容版本的PHP(5.3和5.4)的当前版本的用户,所以尽管PHP 5.5尚未发布,就可以立即开始使用新的API。
:您可以从这里下载兼容性库https://github.com/ircmaxell/password_compat
另外:你问什么是“盐”是。 自从我在这个答案提到几次,我应该解决这个问题的一部分了。
盐是基本上哈希处理时,为了使其难以破解添加到密码的附加字符串。
例如,攻击者可能事先知道散列值是一个给定的密码串,甚至一大堆给定的密码字符串。 如果他能得到您的散列数据的保持,您没有使用盐,那么他就可以只比较你哈希对他已知的密码列表,如果您的任何用户使用的是容易被猜到的密码,他们会破获秒,无论使用什么散列方法的。
但是,如果你已经添加了一个秘密额外的字符串时,它哈希密码,那么散列值将不匹配原始密码的哈希值标准,从而使其更难攻击者发现的价值。
好消息是,如果你使用我上面提到的API,那么你就不需要太担心这个细节,因为API处理腌制你。
希望帮助。