试图围绕PHP密码salt /加密

时间:2011-10-06 20:19:15

标签: php mysql salt

目前我正在开发一个允许在线注册的应用程序。对于开发,密码检查只检查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>";

我对实施盐系统感到困惑。如何更改此脚本以检查加密密码?我还没有找到一个很好的教程来详细解释这个。

2 个答案:

答案 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是你的加密函数