首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP安全盐:&$sha2= null?

PHP安全盐:&$sha2= null?
EN

Stack Overflow用户
提问于 2010-10-10 10:25:52
回答 1查看 1.9K关注 0票数 3

我现在正在创建一个sha2登录表单,在研究并寻求在线帮助后,我发现下面这个链接的示例代码非常有用和实用(我希望我是对的!??),我唯一不理解的是这个程序员编写函数和从函数中获取Salt值的方式。

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

代码语言:javascript
复制
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);
}

如果我把函数改成这样会有什么不同?

代码语言:javascript
复制
function HashMe($phrase, $salt)  {..}

当然这个函数会失败,在$salt前有一个'&‘是为了什么?有必要让' null‘像这样&$salt =null吗?如果我把'&$salt‘放进去会怎么样?

然后,要获得Salt值,您可以直接将其放入sql查询中,如下所示:

代码语言:javascript
复制
$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值。

代码语言:javascript
复制
$salt = "'".salt."'";
$username = "'".$username."'";
$hashed_password = "'".$hashed_password."'";

然后,

代码语言:javascript
复制
$sqlquery = 'INSERT INTO  `usertable` ("username", "password", "salt") VALUES  ($username, $hashed_password, $salt) WHERE 1';

我不喜欢/不想在我的sql查询中使用这个- "'“的原因是,有时我有NULL值,比如$firstname = ' null ';如果名字为空/ null,我希望行将空字段‘勾选’为null。

此外,在我的sql查询中有"'“,当出现问题时,让我感到头晕,很难调试……

对不起,我在这个帖子里有很多问题!

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-10 10:43:50

让我们看看我能不能一次回答一个问题。

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

其次,您询问了为什么在函数声明中需要在$salt之前加上&。&的意思是通过引用来传递值。通常,当您将一个值传递给一个函数时,会创建该值的一个副本,您可以对该副本进行操作。举个例子:

代码语言:javascript
复制
function addOne($number){
    $number = $number + 1;
}

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

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

代码语言:javascript
复制
function addOne(&$number){
    $number = $number + 1;
}

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

现在我们的代码输出4。该函数通过引用传递$salt,因为它更改了$salt的值。因此,在函数运行之后,您现在就有了$salt的新值。

至于为什么你需要&$salt = null,如果你不自己声明它,那就是自动声明变量。因此,如果您只想生成一个随机散列(由于您不知道使用了什么盐,因此无法重新创建它),则可以使用HashMe("message to hash");调用该函数。= null表示如果没有第二个参数,则自动将第二个参数设置为"null“。然而,在后面的代码中,它说明如果第二个参数为"null",则生成一个随机盐:

代码语言:javascript
复制
if ($salt == '')
{
    $salt = substr(hash('sha512',uniqid(rand(), true).$pepper.microtime()), 0, SALT_LENGTH);
}

因此,如果您以这种方式调用该函数,您将创建一个您可能永远无法重现的散列。

对于您的第四个问题,您希望获得$salt的值,以便在SQL查询中使用。这就是通过引用传递的美妙之处。由于变量$salt是通过引用传递的,因此在函数运行之后,您只需再次使用$salt,它将具有新值。需要注意的一件重要事情是,该函数更改$salt所做的全部工作就是确保它的长度为15个字符。任何较长的值都会被截断,但较短的值将保持不变。因此,如果您存储函数返回的(15个字符)盐,您可以在将来使用它,并且它不会再次更改盐。因此,您的SQL查询应该可以完美地工作。

代码语言:javascript
复制
$sqlquery = "INSERT INTO  `usertable` ('username', 'password', 'salt') VALUES  ($username, $hashed_password, $salt) WHERE 1";

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

代码语言:javascript
复制
$secret = "Hello, there";
echo '$secret'; // "$secret"
echo "$secret"; // "Hello, there"
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3898755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档