PHP中的密码哈希:我这样做了吗?

时间:2012-03-24 13:05:09

标签: php mysql function hash passwords

我正在尝试使用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;
  }
}

上面的代码片段创建了一个巨大的哈希值(特定的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;
  }
}

你怎么看?我不是安全方面的专家,如果有人能给我一个提示,我会很高兴。

还有一件事:处理会话以保持用户登录的更好方法是什么?

(抱歉英语不好,这不是我的母语)。

3 个答案:

答案 0 :(得分:1)

在这种情况下,有点显而易见的是,密码与两个sha1散列字符串相连,并且攻击者更容易通过检查两个哈希来强制它,并且盐在这里有点无意义因为看看你的代码:什么是你做的只是......根本不检查它!

在我看来,您可以将静态安全盐与静态用户的信息连接起来,例如注册日期,注册IP(等)。

然后用法看起来像这样:

$pass = sha1($password . $staticSalt . $registerDate);

这样做的好处是,即使攻击者发现与蛮力发生冲突,然后将找到的字符串放入password字段后,密码也会评估为:

$bruteForcedPassword . $staticSalt . $registerDate

与用户的哈希密码相比,这仍然不同。

在这个approche攻击者必须知道你的静态安全盐,你正在构建密码字符串的方法和用户的注册日期(或其他东西组合成密码)。

另请阅读timing attacks

编辑: 或者只使用此library for password hashing

答案 1 :(得分:1)

我觉得这个功能很冗余 uniqid已经基于当前时间。

function createSaltedPass($pass) {
    $salt = hash('sha256', uniqid( mt_rand(), true ));
    $pass = hash('sha256', $salt . $pass);
    return $salt . $pass;
}

对我来说足够了

然而,所有散列的东西并不重要 真正重要的是密码强度。
对于弱密码哈希是没用的。

答案 2 :(得分:0)

而不是hash()功能,您应该使用crypt()。它更适合散列密码。而且它还允许您将salt和hash存储在一起。

至于保持用户登录,会话在您关闭标签/浏览器时结束。如果您想让您的用户登录更长的时间,您将不得不使用cookie。

我建议使用“受保护”的cookie:

  

数据|时间戳|验证哈希

验证哈希是从data + timestamp + some predefined string创建的。这样可以确保用户没有与data部分混淆。此外,我会提醒不要使用IP。虽然这会增加额外的保护,但它也会使移动设备(包括笔记本电脑)的使用有些烦人。