PHP Crypt()比较两个加密的字符串

时间:2013-01-07 12:51:13

标签: php crypt

是否可以比较两个cryptDocs-ed字符串并查看它们是否匹配?

用户登录后,会创建一个会话,存储用户的ID及其对应的crypt - ed密码哈希值。在后台,检查一直在运行,以查看会话(读取,密码)是否仍然有效。

从技术上讲,我想将数据库中的crypt - ed密码与会话中的加密密码进行比较。这可能吗?

编辑:

应该说我使用以下方法来加密密码;

    function better_crypt($input, $rounds = 7)
  {
    $salt = "";
    $salt_chars = array_merge(range('A','Z'), range('a','z'), range(0,9));
    for($i=0; $i < 22; $i++) {
      $salt .= $salt_chars[array_rand($salt_chars)];
    }
    return crypt($input, sprintf('$2a$%02d$', $rounds) . $salt);
  }

5 个答案:

答案 0 :(得分:5)

只需查看PHP Manual on crypt即可。该示例清楚地说明了如何验证密码(以便如何比较)。

<?php
$hashed_password = crypt('mypassword'); // let the salt be automatically generated

/* You should pass the entire results of crypt() as the salt for comparing a
   password, to avoid problems when different hashing algorithms are used. (As
   it says above, standard DES-based password hashing uses a 2-character salt,
   but MD5-based hashing uses 12.) */
if (crypt($user_input, $hashed_password) == $hashed_password) {
   echo "Password verified!";
}
?>

您可以(当然)直接比较两个散列密码(因为它们都是字符串),但它们不能保证相等。

请注意crypt可能不是“非常”安全。阅读更多Secure hash and salt for PHP passwords并查看有关密码哈希的PHP手册条目:http://php.net/faq.passwords - 这应该可以帮助您入门。

答案 1 :(得分:0)

可以比较散列密码是否相等。

答案 2 :(得分:0)

你可以简单地将两个字符串相互比较。 if($ _SESSION ['hash'] == $ databasehash)。

为什么要比较两个密码?我建议您在数据库中创建会话表,并检查用户是否仍然登录。还要将其绑定到IP,或让用户可以选择这样做。它增加了更多的安全性。

此外,如果用户在$ _SESSION过期后回来,您可以存储cookie。比较cookie与存储的IP和哈希,如果它仍然是盛宴。

答案 3 :(得分:0)

  

是否可以比较两个加密的字符串并查看它们是否匹配? [用于密码匹配]

是。它不仅可行,而且是推荐的最佳实践。您应该只在数据库中存储密码的散列版本,而不是实际的密码,因此您应该只使用要比较的hased版本。如果你这样做,你很明显 来比较哈希值,因为无论如何你都无法回到原来的状态。

但请确保使用安全的哈希例程,例如bcrypt。不要将md5用于散列或sha1,或类似的东西。

还建议使用经过良好测试的库来管理您的密码,而不是自己编写密码。我建议这个:https://github.com/ircmaxell/password_compat - 它是由一个负责安全性的核心PHP开发人员编写的,这个lib提供的相同功能将作为PHP本身的一部分内置,因为下一个PHP版本( v5.5),在一两个月内到期,所以它也是未来安全的。

答案 4 :(得分:-1)

是的,这是散列密码的目的。

一个重要的警告是散列函数不是真正的双射映射,它们具有一定程度的冲突 - 只是指出散列!=加密。