【发布时间】:2012-04-08 18:26:48
【问题描述】:
我正在尝试使用 PHP 创建一个登录系统,但我不太确定我的脚本是否真的很好,请查看以下内容。
所以,我创建了两个函数...其中一个用于创建哈希,另一个用于检查它。
查看函数:
function createSaltedPass($pass = false, $username = false) {
if($pass && $username)
{
$salt = hash('sha256', uniqid( mt_rand(), true ) . md5(date('d m Y H i s') . " # ") . $username);
$pass = hash('sha256', $salt . $pass . $salt);
$pass = $salt . $pass;
return $pass;
}
}
上面的 sn-p 创建了一个巨大的哈希(具体是 128 个字符),我不知道它是否真的安全。
前半部分是盐,它让我可以在需要时检查它。
后半部分是真正的加盐密码。
查看密码示例:
939cf87873a402d48bcf66a57b64ca38d6f1db9155381ffe1aae9a469e93d1e7ec338071f2dd21a96ef5fc799a3f3921b0df3188458b17422db79271056a1fda
使用第一个功能后查看密码检查功能:
function checkSaltedPass($dbPass = false, $pass = false) {
if($pass && $dbPass)
{
$salt = substr($dbPass, 0, 64);
$pass = hash('sha256', $salt . $pass . $salt);
$pass = $salt . $pass;
return $pass;
}
}
你怎么看?我不是安全方面的专家,如果有人能给我提示,我将不胜感激。
还有一件事:处理会话以保持用户登录的更好方法是什么?
(抱歉英语不好,这不是我的母语)。
【问题讨论】:
-
你为什么要对盐进行两次散列?此外,
checkSaltedPass从不检查(散列的)密码是否匹配! -
好吧,第一部分创建盐的哈希,第二部分做同样的事情,但是将盐与密码一起使用,第三部分连接。盐和密码(这就是为什么我说密码的前 64 个字符 [hashed] 将是盐)。所以,我以后可以去看看。
-
不需要hash salt+pass+salt;只是哈希盐+通过。第二次使用盐不会增加加密价值。也没有必要让哈希值真正随机化,只要每个密码不同即可。
-
顺便说一句,+1 用于使用标准算法和技术,以及在实施它们之前进行仔细检查,而不是在系统受到威胁之后进行仔细检查。 :-)
标签: php mysql function hash passwords