我现在正在在网上进行研究并寻求帮助后创建SHA2登录表格,我从下面的此链接中找到示例代码非常有用和实用(我希望我是对的!是该程序员编写功能并从功能中获取盐值的方式。

http://hungred.com/useful-information/php-better-hashing-password/

define('SALT_LENGTH', 15);

function HashMe($phrase, &$salt = null)
{
    $pepper = '!@#$%^&*()_+=-{}][;";/?<>.,';

    if ($salt == '')
    {
        $salt = substr(hash('sha512',uniqid(rand(), true).$pepper.microtime()), 0, SALT_LENGTH);
    }
    else
    {
        $salt = substr($salt, 0, SALT_LENGTH);
    }

    return hash('sha512',$salt . $pepper .  $phrase);
}

如果我将功能更改为此有什么区别?

function HashMe($phrase, $salt)  {..}

当然,此功能会失败,在$盐之前拥有'&'是什么?是否有必要像这样的“ null”和$ salt = null?如果我放'&$盐'怎么办?

然后,为了获得盐值,您可以将其直接放置,然后将其放置在下面的SQL查询中,

$username = cleanMe($_POST('username'));
$password = cleanMe($_POST('password'));
$salt = '';
$hashed_password = HashMe($password, $salt);
$sqlquery = 'INSERT INTO  `usertable` ("username", "password", "salt") VALUES  ("'.$username.'", "'.$hashed_password .'", "'.$salt.'") WHERE 1';
..

在准备SQL查询之前,如何从下面的功能中获取盐值,

$salt = "'".salt."'";
$username = "'".$username."'";
$hashed_password = "'".$hashed_password."'";

然后,

$sqlquery = 'INSERT INTO  `usertable` ("username", "password", "salt") VALUES  ($username, $hashed_password, $salt) WHERE 1';

我不喜欢/不想拥有它的原因 - “'”在我的SQL查询中,我的零值有时像$ firstName ='null';而且,如果FirstName为空/ NULL,我希望该行将空字段“勾选”为空字段。

此外,在我的SQL查询中有“'”,让我头晕目眩和难以调试。

抱歉,我在这个线程中有很多问题!

谢谢。

有帮助吗?

解决方案

让我们看看我是否可以一次回答您的问题。

首先,你问为什么 function HashMe($phrase, $salt) 失败,而 function HashMe($phrase,&$salt = null) 才不是。解释第二部分和第三部分后,这将变得清晰。

第二,您问为什么您需要和之前 $salt 在您的功能声明中。 &的含义是您正在传递价值 引用. 。通常,当您将值传递给函数时,创建该值的副本,然后在副本上工作。因此:例如:

function addOne($number){
    $number = $number + 1;
}

$myNumber = 3;
addOne($myNumber);
echo $myNumber;

此代码将输出 3, , 不是 4. 。这是因为该函数不会更改$ mynumber,它会创建它的副本并更改该副本。当您通过引用时,您会告诉它在原始数字上工作,而不是创建副本。因此,如果我们做出略微改变:

function addOne(&$number){
    $number = $number + 1;
}

$myNumber = 3;
addOne($myNumber);
echo $myNumber;

现在我们的代码输出 4. 。该功能通过引用通过$盐,因为它更改了$盐的值。因此,在功能运行后,您现在拥有$盐的新值。

至于为什么你需要 &$salt = null, ,如果您不自己声明,那将自动删除该变量。因此,如果您只想生成一个随机哈希(因为您不知道使用了什么盐而没有重新创建它),则只需调用该功能 HashMe("message to hash");. 。这 = null 意味着,如果没有第二个参数,则将第二个参数自动设置为“ null”。但是,在代码后期,它说,如果第二个参数为“ null”,则会生成随机盐:

if ($salt == '')
{
    $salt = substr(hash('sha512',uniqid(rand(), true).$pepper.microtime()), 0, SALT_LENGTH);
}

因此,如果您以这种方式调用该功能,您将创建一个哈希,您可能永远无法复制。

对于您的第四个问题,您想获得用于SQL查询的$盐的值。这就是通过参考的美丽。由于可变$盐是通过引用传递的,因此在功能运行后,您可以再次使用$盐,并且它将具有新的值。要注意的一件重要的事情是所有功能都可以 改变 $盐是确保它长15个字符。任何更长的东西都被截断了,但是任何短暂的东西都不会被触及。因此,如果您存储了该功能返回的(15个字符)盐,则可以将来使用它,并且不会再次改变盐。因此,您的SQL查询应该完美地工作。

$sqlquery = "INSERT INTO  `usertable` ('username', 'password', 'salt') VALUES  ($username, $hashed_password, $salt) WHERE 1";

请注意,我从您的原始查询中交换了双重语句。这是因为在某些版本的PHP变量中不会单引号解析。例如:

$secret = "Hello, there";
echo '$secret'; // "$secret"
echo "$secret"; // "Hello, there"
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top