3

所以基本上我在我的注册表单中加密了密码,如下所示:

    $query = "INSERT INTO users(first_name, last_name, email, password, 
                         username) VALUES ('$fn', '$ln', '$em', SHA('$pw1'), '$un')"; 

现在密码是散列的,但是当我尝试在我的登录脚本中使用它时它不想工作并且函数 mysql_num_rows 返回 0。

    <?php
                ob_start();
                    //If login button is pressed
                    if(isset($_POST['submitted'])){
                        //Username clean up
                        if(preg_match('%^[a-zA-Z0-9_-]{6,20}$%', stripslashes(trim($_POST['username'])))){
                            $u = escape_data($_POST['username']);
                        } else {
                            $u = FALSE;
                            echo '<p><font color="red" size="+1">Please enter valid username</font></p>';
                        }

                        //Password clean up
                        if(preg_match('%^[a-zA-Z0-9_-]{6,20}$%', stripslashes(trim($_POST['password'])))){
                            $p = escape_data($_POST['password']);
                        } else {
                            $p = FALSE;
                            echo '<p><font color="red" size="+1">Please enter valid password</font></p>';
                        }

                        //Check if both matched
                        if($u && $p){
                            $query = "SELECT * FROM users WHERE username='$u' AND password=SHA('$p')";
                            $result = mysql_query($query);
                            $count = mysql_num_rows($result);
                            $row = mysql_fetch_array($result, MYSQL_NUM);
                            if($count != 0){
                                $_SESSION['username'] = $row[1];
                                $_SESSION['password'] = $row[3];
                                header("Location: login_confirmed.php");
                            } else {
                                echo "Wrong username or password!";
                            }
                        } 
                    }
                    ob_end_flush();
                ?>
4

1 回答 1

1

这可能是因为您的密码字段类型。是你的密码字段VARCHAR吗?多久了?在我看来,SHA生成的字符串长度超过了字段允许的长度,因此它在存储时会被截断,而当您重新生成它以进行检查时它确实匹配。

MySQL 文档说您需要 40 个字符来存储SHA.

计算字符串的 SHA-1 160 位校验和,如 RFC 3174(安全散列算法)中所述。该值以 40 个十六进制数字的字符串形式返回,如果参数为 NULL,则返回 NULL。此函数的一种可能用途是用作哈希键。

于 2013-07-09T12:25:13.090 回答