Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL SHA()不';行不通_Php_Mysql_Hash - Fatal编程技术网

Php MySQL SHA()不';行不通

Php MySQL SHA()不';行不通,php,mysql,hash,Php,Mysql,Hash,基本上我在注册表中加密了密码,如下所示: $query = "INSERT INTO users(first_name, last_name, email, password, username) VALUES ('$fn', '$ln', '$em', SHA('$pw1'), '$un')"; 现在密码是散列的,但当我尝试在登录脚本中使用它时,它不想工作,函数mysql\u num\u rows返回0 <?php

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

    $query = "INSERT INTO users(first_name, last_name, email, password, 
                         username) VALUES ('$fn', '$ln', '$em', SHA('$pw1'), '$un')"; 
现在密码是散列的,但当我尝试在登录脚本中使用它时,它不想工作,函数mysql\u num\u 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();
                ?>

这可能是因为您的密码字段类型。您的密码字段是
VARCHAR
?多长时间?在我看来,
SHA
生成的字符串比字段允许的长度长,因此在存储时会被截断,在重新生成以进行检查时会匹配

表示需要40个字符来存储
SHA
的输出

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


密码字段的类型是什么?是否检查了数据库中的插入值和检索值?警告:SHA不是加密算法!这是一个哈希算法
password
,您在列名中使用的是一个保留字,如果用作列名,可能会产生很多问题。在尝试其他操作之前,请确保已插入数据。如果需要,请使用
echo
调试脚本。如果你自己解决这个问题,而不是寻求帮助,你将获得更多的利润。扩展@RussellUhl comment。散列和加密之间的区别:散列文本无法恢复(通常),而加密文本可以恢复[text=decrypt(encrypt(text))]惊人的是,它成功了。我让瓦查尔(30岁)摆好了桌子。我想不出来。非常感谢你!太神奇了。你为什么会有varchar(30岁)呢?你知道什么是varchar以及它们是如何工作的吗?我想,密码通常大约是30个字符,但我忘了SHA函数使字符串长度为40个字符。@user2564336,cf。