我有一个允许用户插入密码的注册页面。我在注册时哈希密码,以便更安全地存储在数据库中。
当用户使用相同的密码登录时,两个哈希值不匹配,用户无法登录。
这是我第一次使用哈希,但它没有按照我的预期行事:
这是注册页面上的哈希码:
$salt ="";
function cryptPass($input, $rounds = 9)
{
$salt = "";
$saltChars = array_merge(range('A','Z'), range('a','z'), range('0','9'));
for($i = 0; $i<22; $i++)
{
$salt .=$saltChars[array_rand($saltChars)];
}
return crypt($input, sprintf('$2y$%02d$test$', $rounds) . $salt);
}
$hashedpass = cryptPass($pass1);
echo $hashedpass;
//************Insert all the members's input to the database**************************//
$query = mysql_query("INSERT INTO members(user_name, first_name, last_name, governorate, district, village, birth_date, email_address, specialization, password, salt, registered_date )VALUES('$username', '$firstname', '$lastname', '$governorate', '$district', '$village', '$bdate', '$email', '$specialization', '$hashedpass', '$salt', now())")or die(mysql_error());
我确实添加了盐,但它给了空
这是登录页面上的哈希码
function cryptPass($input, $rounds = 9)
{
$salt = "";
$saltChars = array_merge(range('A','Z'), range('a','z'), range('0','9'));
for($i = 0; $i<22; $i++)
{
$salt .=$saltChars[array_rand($saltChars)];
}
return crypt($input, sprintf('$2y$%02d$test$', $rounds) . $salt);
}
$hashedpass = cryptPass($pass);
echo $hashedpass;
$sql=mysql_query( "SELECT user_id, email_address, first_name, user_name FROM members WHERE email_address='$email'AND password= '$hashedpass' LIMIT 1") or die("error in members table");
$login_check = mysql_num_rows($sql);
if($login_check > 0)the hashing password = $2y$09$test$4ZGgCiXdKzgQvuzwu.AxfdWvZadDCE.LD6HCkrK3ZsqJeN7e
答案 0 :(得分:1)
当用户注册时,您需要在数据库中存储salt和哈希密码。当用户尝试登录时,您需要使用与注册时相同的相同的盐,否则哈希将不同。这被称为每用户盐,是更安全的选择。
更简单但安全性较低的选项是为应用程序生成单个salt值并将其用于所有用户。这样可以保留数据库中所有密码的哈希值,但安全性要低得多,因为如果盐值受到损害,那么对哈希密码进行暴力破解是一件小事。
答案 1 :(得分:0)
您需要将salt与散列密码一起存储在数据库中。
当用户尝试登录时,您需要从数据库中获取salt,并使用它对用户输入进行哈希处理,以将其与哈希密码进行比较。
在您的示例中,您在登录过程中生成一个随机盐,它将永远不会产生与您在数据库中相同的散列。
答案 2 :(得分:0)
如果您要自己编写,则需要将生成的盐存储在数据库中(正如其他响应者所说)。更一般地说,我会尝试尽可能多地委托一个提供开箱即用密码支持的外部库。正确加密是很困难的,在开始自己编写之前,你真的需要阅读更多内容。那里有很好的图书馆支持。你应该使用它。
另外,你真的不应该使用MD5来散列密码。使用bcrypt,pbkdf2或其他适用于密码的哈希。只需使用图书馆。
答案 3 :(得分:0)
密码腌制的工作原理是在对密码进行散列之前,将预定义的随机明文集附加到密码中。这避免了为两个选择相同密码的用户设置两个相同的哈希值。想象一下系统的两个用户user1和user2,选择“ letmein ”作为密码:
salt_user1 = 'awoidjalskdm'
hash = MD5('letmein'+salt_user1) = ab82a9c495e3fe88d1986176e4850b1d
和for user2
salt_user2 = 'duiesnblekfn'
hash = MD5('letmein'+salt_user2) = 69caac44b5ee9f8b6468b5625000723a
假设你的数据库结构是用户名:salt:password_hash,你会有这样的:
user1:awoidjalskdm:ab82a9c495e3fe88d1986176e4850b1d
user2:duiesnblekfn:69caac44b5ee9f8b6468b5625000723a
密码腌制的主要目的是避免在数据库受到损害时大规模密码泄露。密码腌制将使得强制执行由几个不同用户选择的简单和流行密码变得更加困难。
在您的情况下,您似乎随机生成盐以进行注册(这很好)。错误似乎出现在登录功能中,您可以在其中重新计算随机盐,而不是检索之前生成的并且应该已存储的盐。
在散列之前,您要附加密码的盐需要对每个用户都相同,并且您需要能够在需要时调用它。即使它看似矛盾,但这意味着它必须以明文形式存储在数据库中。