在网上研究和寻求帮助后,我现在正在创建一个 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."'";
$username = "'".$username."'";
$hashed_password = "'".$hashed_password."'";
然后,
$sqlquery = 'INSERT INTO `usertable` ("username", "password", "salt") VALUES ($username, $hashed_password, $salt) WHERE 1';
我不喜欢/不想在我的 sql 查询中使用这个 - "'" 的原因是我有时有空值,例如 $firstname = 'NULL'; 如果名字为空/空,我希望该行将空字段“勾选”为空。
此外,在我的 sql 查询中有“'”,当出现问题时让我头晕目眩并且难以调试......
对不起,我在这个线程中有很多问题!
谢谢。