是否可以比较两个crypt
Docs-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);
}
答案 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)
是的,这是散列密码的目的。
一个重要的警告是散列函数不是真正的双射映射,它们具有一定程度的冲突 - 只是指出散列!=加密。