我有一个密码从我的iPhone应用程序通过php脚本user.php传递到数据库中。
变量$pass由以下内容填充:
$pass = str_replace("'", "", $_REQUEST['pass']);
在将其插入数据库之前,我该如何加密它?我已经了解了一些不同的技术,但正在寻找最好的管理方式。
感谢大家。
我有一个密码从我的iPhone应用程序通过php脚本user.php传递到数据库中。
变量$pass由以下内容填充:
$pass = str_replace("'", "", $_REQUEST['pass']);
在将其插入数据库之前,我该如何加密它?我已经了解了一些不同的技术,但正在寻找最好的管理方式。
感谢大家。
虽然下面的答案在技术上仍然是正确的,但php已经提出了关于使用哈希算法的新建议。他们的建议,自php>= 5.5.0以来,是使用password_hash
和password_verify
函数对密码进行哈希和验证。作为附加好处,这些函数会自动包含返回哈希的个性化salt,因此您不需要明确担心它。
$pass = sha1($_REQUEST['pass']);
为了增加安全性,可以向哈希值添加盐并再次运行哈希函数。这样做可以使恶意生成密码哈希更加困难,因为盐值仅在服务器端处理。
示例:
$pass = sha1(sha1($_REQUEST['pass']).sha1("mySalt@$#(%"));
首先,您应该创建一个随机的用户盐值。然后您应该将其和密码哈希值存储在数据库中。
$salt = md5(unique_id().mt_rand().microtime());
$pass = sha1($salt.$_REQUEST['pass']);
将$salt和$pass保存在数据库中。然后当他们登录时,您查找他们的行并检查哈希值:
$user = query('SELECT * FROM `user` WHERE username = ?', array($_REQUEST['username']));
if($user)
{
// If the password they give maches
if($user->pass === sha1($user->salt. $_REQUEST['pass']))
{
// login
}
else
{
// bad password
}
}
else
{
// user not found
}
最基本的方式:使用MD5或SHA1进行哈希处理
$newpass = md5($_REQUEST['pass']);
或者
$newpass = sha1($_REQUEST['pass']);
最近我开始将用户名也进行哈希存储,这样登录尝试就可以使用仅哈希数据进行比较来保证安全。
您可以使用额外的数据对哈希值进行“盐”处理,以便在泄露时无法找到其价值(尝试谷歌一些简单的哈希词语)...例如,使用一个站点范围内的字符串来改变标准哈希,如md5("mySiteSalt!!" . $_REQUEST['pass']);
或更高级的方法。
使用crypt加一些盐。例如
$user = strip_tags(substr($_REQUEST['user'],0,32));
$plain_pw = strip_tags(substr($_REQUEST['pass'],0,32));
$password = crypt(md5($plain_pw),md5($user));
就像在http://www.ibm.com/developerworks/opensource/library/os-php-encrypt/上所述的那样。
在数据库中存储密码时,您应该使用SHA1进行哈希处理。这是最简单、最有效的存储密码的方法:
$password = sha1($password);
它也异常安全。虽然其完整性开始受到侵蚀,但将此函数升级为SHA-256(非常安全)相当容易。
如果你想知道为什么 md5、sha1 及其快速的朋友可能不是一个好主意,你应该阅读 Thomas Ptacek 的文章Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes。要点如下:
最后,我们了解到,如果我们想安全地存储密码,我们有三个合理的选择:PHK 的 MD5 方案、Provos-Maziere 的 Bcrypt 方案和 SRP。我们了解到正确的选择是 Bcrypt。
注意:这里说的是 PHK,而不是 PHP。