虽然PHP提供了散列和加密函数、字符串函数,咱们仍是有必要采起额外的安全措施以确保用户的信息安全。给密码加salt,也就是在对密码进行散列计算时添加额外的字符串,是一种至关简单有效地加强安全性的方法。html
salt是一个字符串,能够事先定义好,也能够随机产生。在对用户输入数据进行散列时,就是用它给输入数据加料。shell
若是不适用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"; }
除此以外,还能够经过增长检查失败登陆次数来加强安全性。那样的话,攻击者在屡次破解一个密码时,会被系统锁定,并且这个措施一样能够防止拒绝服务攻击或那些发送巨量请求试图让站点因过载而死机的攻击。spa
调置口令失败的上限,若是失败过多,则把账号锁了,须要用户以找回口令的方式来从新激活账号。可是,这个功能可能会被恶意人使用。最好的方法是,增长其尝试的时间成本。如,两次口令尝试的间隔是5秒钟。三次以上错误,账号被临时锁上30秒,5次以上账号被锁1分钟,10次以上错误账号被锁4小时……code
参考资料:htm
[book]: 深刻PHP与JQuery开发blog
[link]: 如何防范密码被破解