2

是否可以比较两个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);
  }
4

5 回答 5

5

只需检查.php 上的 PHP 手册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 密码中阅读更多内容,并查看有关密码哈希的 PHP 手册条目:http: //php.net/faq.passwords - 这应该可以帮助您入门。

于 2013-01-07T12:54:08.653 回答
0

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

于 2013-01-07T12:52:48.603 回答
0

您只需将两个字符串相互比较即可。如果($_SESSION['hash'] == $databasehash)。

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

此外,如果用户在 $_SESSION 过期后返回,您可以存储一个 cookie。将 cookie 与存储的 IP 和哈希值进行比较,如果它仍然可以吃的话。

于 2013-01-07T12:56:36.743 回答
0

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

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

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

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

于 2013-01-07T12:59:38.497 回答
-1

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

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

于 2013-01-07T12:56:48.553 回答