我是一名使用PHP构建新网站的开发人员,我想知道最好用什么来进行哈希处理。我已经看过md5和sha1了,但有没有更安全的方法?
如果这是一个初级问题,我很抱歉,因为我刚开始学习PHP安全性,并且正在尽可能使我的网站更加安全。另外,什么是盐?
谢谢,
Waseem
首先,已经证明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";
}
crypt($password, $salt);
如果您计划用于密码,那么不要使用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
另外:您问了什么是“盐”。由于我在这个答案中提到了几次,所以我也应该解决这部分问题。
盐基本上是在哈希密码时添加的附加字符串,以使其更难破解。
例如,攻击者可能事先知道给定密码字符串的哈希值,甚至是许多给定密码字符串的哈希值。如果他能够获取您的哈希数据并且您没有使用盐,则他可以将您的哈希与已知密码列表进行比较,如果您的任何用户使用易于猜测的密码,则无论使用了什么哈希方法,他们都会在几秒钟内被破解。
但是,如果您在哈希密码时添加了一个秘密的额外字符串,那么哈希值将不匹配原始密码的标准哈希值,从而使攻击者更难找到该值。
好消息是,如果您正在使用我上面提到的API,则不需要过多担心此类细节,因为API会为您处理盐。
希望这有所帮助。
bcrypt
- 就是这样。 - Leigh