通过给密码加salt增强安全性

  虽然PHP提供了散列和加密函数、字符串函数,我们还是有必要采取额外的安全措施以确保用户的信息安全。给密码加salt,也就是在对密码进行散列计算时添加额外的字符串,是一种相当简单有效地增强安全性的方法。

  salt是一个字符串,可以事先定义好,也可以随机产生。在对用户输入数据进行散列时,就是用它给输入数据加料。

  如果不适用salt,会这样对密码进行散列:

$hash = sha1($password);

  下面的代码给上面这个散列运算加了点随机的salt:

$salt = substr(mdt(time()), 0, 7);       //创建随机salt
$hash = $salt. sha1($salt$password);

  上面的代码生成了一个随机的长度为7的salt(字符串)。在散列前把salt作为这个密码的前缀,这意味着即使两个用户使用相同的密码,散列后的密码也不会相同。

  为了可以重新获得这个散列值,我们需要把这个salt保存起来备用。因此,salt再一次作为前缀,计算得来的散列值的前缀,以未加密的方式保存到最终的散列值中。这样,当一个用户登录时,你能够从数据库中得到散列后的密码并从中获取到salt,然后使用它重新生成加了salt的散列后的用户密码。

$salt = substr($dbhash, 0, 7);        //释放散列值中的salt
$hash = $salt . sha1($salt. htmlentities($_POST['password'], ENT_QUOTES));
if($hash == $dbhash){
      echo "success";       
}else{
      echo "NO match";   
}

  除此之外,还可以通过增加检查失败登录次数来增强安全性。那样的话,攻击者在多次破解一个密码时,会被系统锁定,而且这个措施同样可以防止拒绝服务攻击或那些发送巨量请求试图让站点因过载而死机的攻击。

调置口令失败的上限,如果失败过多,则把帐号锁了,需要用户以找回口令的方式来重新激活帐号。但是,这个功能可能会被恶意人使用。最好的方法是,增加其尝试的时间成本。如,两次口令尝试的间隔是5秒钟。三次以上错误,帐号被临时锁上30秒,5次以上帐号被锁1分钟,10次以上错误帐号被锁4小时……

 

参考资料:

[book]: 深入PHP与JQuery开发

[link]: 如何防范密码被破解

posted @ 2014-02-22 13:57  wannianma  阅读(2015)  评论(0编辑  收藏  举报