目前我正在开发一个允许在线注册的应用程序。对于开发,密码检查只检查MySQL行以确保该值与输入字段中的值匹配。
此代码检查该行是否存在:
$res = mysql_query("SELECT * FROM `users` WHERE `username` = '".$username."' AND `password` = '".$password."'");
$num = mysql_num_rows($res);
//check if there was not a match
if($num == 0){
//if not display error message
echo "<center>The <b>Password</b> you supplied does not match the one for that username!</center>";
我对实施盐系统感到困惑。如何更改此脚本以检查加密密码?我还没有找到一个很好的教程来详细解释这个。
答案 0 :(得分:2)
salt是在加密和解密之前添加到密码开头或结尾的一组字符,以便更难以进行暴力攻击。
您首先创建salt,它只是一个随机固定的字符系列,然后在对其进行散列之前将其添加到密码中。您还应该在将数据放入查询之前转义数据以防止MySQL注入攻击。
在输入数据库传递时执行此操作
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['pass']);
$pass_hash = md5($SALT.$password);
mysql_query(*query to insert $username and $pass_hash into db*)
检查密码是否正确
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['pass']);
$res = mysql_query(*query to extract $pass_hash from db where username==$username)
//get the password from the $res and put it in a var
if(md5($SALT.$pass_hash_from_db) == $password){*correct pass*} else {*invalid login*}
将$ SALT设置为一些大的随机静态字符串,例如$ SALT =“WEHGFHAWEOIfjo; cewrxq#$%”;
答案 1 :(得分:0)
如果用户注册并将其保存在数据库中,则必须生成新的盐。
// you save this in the database
$encPass = encFunction( $password.$salt );
当某个用户想要登录时,检查此密码是否是该用户的密码列。
注意:
- encFunction是你的加密函数