PHP:散列代码不再工作了?

PHP:散列代码不再工作了?,php,hash,Php,Hash,我使用这个哈希函数有一段时间了,是从互联网上得到的。问题是,以前它可以立即工作,但现在它却在抱怨一个参数。代码如下: function generateHash($plainText, $salt = null) { if ($salt === null) { $salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH); } else { $salt = substr

我使用这个哈希函数有一段时间了,是从互联网上得到的。问题是,以前它可以立即工作,但现在它却在抱怨一个参数。代码如下:

function generateHash($plainText, $salt = null)
{

    if ($salt === null)
    {
        $salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
    }
    else
    {
        $salt = substr($salt, 0, SALT_LENGTH);
    }
    return $salt . sha1($salt . $plainText);
}
因此,我将在方法调用中使用以下代码:

validateUserInput($userid, $pass);
验证输出为:

function validateUserInput($username, $password)
{
    //$username = mysql_real_escape_string($username);
    //$password = mysql_real_escape_string($password);

    if(!$username || !$password)
    {
        //$errors['credentials'] = 'Missing Credentials!';
        //$_SESSION['errors_array'] = $errors;
        //echo $errors['credentials'];
        header("LOCATION:XXXXXXX.php");
    }

    $local_salt = generateHash($password);
    //echo $local_salt;
    $groupid;

    if($username != null && $password !=null)
    {   
        connectToServer();
        $result = mysql_query("SELECT * FROM users WHERE hashkey = '{$local_salt}'");

        while($row_access = mysql_fetch_array($result))
        {
            $groupid = $row_access['groupid'];
        }
        if(!isset($result))
        {
            $errors['not_found_user'] = 'No Users Found with Provided Credentials!';
            //$_SESSION['errors_array'] = $errors;
            $userfound = 0;
            $_SESSION['user_available'] = $userfound;
        }elseif(isset($result)){
            $_SESSION['user_logged'] = array('username' => $username, 'password' => $password, 'salt' => $local_salt, 'groupid' => $groupid);
            $userfound = 1;
            //echo "stored";
            $_SESSION['user_available'] = $userfound;
        }       
    }
}
最后,错误是:

Warning: substr() expects parameter 3 to be long, string given in /home/XXXX.php on line 64

这指向函数generateHash

显然SALT_LENGTH不是整数。找到定义的位置并更正此错误。

错误本身告诉您一切。恒定的盐长度不是很长。我怀疑它根本没有定义,所以PHP将裸字符串转换为字符串SALT_长度,并将其传递给substr,substr对此表示不满

话虽如此。。。此代码错误得很危险:

如果!isset$结果:真的吗?此条件将始终为false,因为$result将始终被设置,除非您遇到mysql_查询问题,但这不会告诉您登录的有效性。由于mysql_查询从不返回null,因此不会拒绝任何登录

此查询:

SELECT * FROM users WHERE hashkey = '{$local_salt}'
这是无效的$local_salt=generateHash$password;。从generateHash函数中,如果未提供盐,将随机为您创建一个盐。因此,对generateHash的每次调用都将生成一个新的哈希,这意味着它无法与数据库中的任何内容进行比较

基于上面两个非常严重的错误,我将永远扔掉这段代码

使用salt时检查有效哈希的正确方法如下:

$_SESSION['user_logged'] = null;

// fetch hashed pw from db, where username is the submitted username
$result = mysqli_query("SELECT hash FROM users WHERE username = '{$username}'");

if ($result->num_rows != 0) 
{
     $row = $result->fetch_assoc();    
     $hash = $row['hash'];

     $salt = substr($hash, 0, SALT_LENGTH); // extract salt 

     if (generateHash($password, $salt) == $hash) 
     {
         // login successful. 
         $_SESSION['user_logged'] = $username; // don't store passwords here
     }
}

// if $_SESSION['user_logged'] is not set, the login failed
if (!isset($_SESSION['user_logged'])) 
{
    // you *don't* want to tell people which one (login or pw) is invalid
    echo 'Invalid login or password';
}

注意:SALT_长度最多为32是非常重要的,否则由于generateHash的实现方式,这将不起作用。

不是每次编写应用程序时都创建一个新的哈希函数,而是应该使用php提供的函数:我建议使用任何blowfish或sha256+哈希


当从数据库中选择信息时,您应该按用户名选择它,然后使用php检查哈希是否符合密码。

是的,我知道,但它过去一直有效!我试图通过使用strlensalt来定义它,但没有起作用,因为salt在进入函数时为null,并且是在函数中生成的。我很欣赏这些评论。谢谢,我们会努力的。尽管如此,您的评论与我的问题无关,我的问题是为什么一段始终有效的代码会停止工作@请阅读第一段。我猜它以前是有效的,因为您在另一个文件中定义了SALT_长度,现在由于任何原因丢失了它。无论如何,我要指出的是,即使它以前工作正常,它也没有做正确的事情。啊哈,谢谢你,非常感谢你的帮助。现在就换吧。确保避免上述陷阱:好的,在考虑实现之前,我做了以下工作:请通知我它是否可行,让我们知道我现在已经开始这么做了…完成了一半…正如你所说,我现在正在检查用户名,然后验证密码hashed@sys_debug哦调查并准备好声明。首先是因为mysql_*函数很古老,很快就会被弃用,其次——如果使用正确,准备好的语句几乎不可能在代码中注入SQL。让我们这样说:当使用准备好的语句时,您需要一种特殊的才能来创建sql漏洞。