PHP安全sha2:&$salt = null?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PHP安全sha2:&$salt = null?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3593字,纯文字阅读大概需要6分钟。
内容图文
![PHP安全sha2:&$salt = null?](/upload/InfoBanner/zyjiaocheng/688/1aaf57df1bf94e1d98ec84e744a1d55f.jpg)
我现在在网上搜索并寻求帮助后,正在创建一个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) {..}
当然,此功能将失败,具有“&”是什么意思在$salt之前?是否需要像& $salt = null这样的“ null”?如果我输入“& $salt”怎么办?
然后,要获取盐值,您可以直接将其放入并按如下所示将其放入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 = "'".salt."'";
$username = "'".$username."'";
$hashed_password = "'".$hashed_password."'";
然后,
$sqlquery = 'INSERT INTO `usertable` ("username", "password", "salt") VALUES ($username, $hashed_password, $salt) WHERE 1';
我不喜欢/不想要这个的原因-在我的SQL查询中是“’”,因为我有时具有空值,例如$firstname =’NULL’;并且我希望该行如果名字为空/ null,则将空字段“勾选”为null.
此外,在我的sql查询中出现“’”,使我头昏眼花,并且在出现问题时难以调试…
抱歉,我在此主题中有很多问题!
谢谢.
解决方法:
让我们看看我能否一次回答您的问题.
首先,您问为什么函数HashMe($phrase,$salt)失败,而函数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,因为它更改了$salt的值.因此,在函数运行之后,您现在有了$salt的新值.
至于为什么需要& $salt = null,如果您自己没有声明变量,那将自动声明该变量.因此,如果您只想生成一个随机哈希(由于不知道使用了哪种盐,就无法重新创建它),您可以使用HashMe(“ message to hash”);调用该函数. = null表示如果没有第二个参数,则将第二个参数自动设置为“ null”.但是,在代码的后面,它说如果第二个参数为“ null”,则生成一个随机盐:
if ($salt == '')
{
$salt = substr(hash('sha512',uniqid(rand(), true).$pepper.microtime()), 0, SALT_LENGTH);
}
因此,如果以这种方式调用该函数,则将创建您可能永远无法复制的哈希.
对于第四个问题,您想获取$salt的值以用于SQL查询.那就是通过引用传递的美丽.由于变量$salt是通过引用传递的,因此在函数运行后,您可以再次使用$salt,它将具有新值.要注意的一件事是,所有更改$salt的功能都确保其长度为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"
内容总结
以上是互联网集市为您收集整理的PHP安全sha2:&$salt = null?全部内容,希望文章能够帮你解决PHP安全sha2:&$salt = null?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。