我正在阅读这篇关于哈希密码的文章,看到了以下部分:
验证密码的步骤:
1. 从数据库中检索用户的盐值和哈希值。 2. 将盐值添加到输入的密码前,然后使用相同的哈希函数进行哈希处理。 3. 将输入的密码的哈希值与数据库中的哈希值进行比较。如果它们匹配,则密码正确。否则,密码不正确。
但我对此流程有些困惑,例如假设我拥有一个用户表(包含id、name、password和email),并且为了登录某个应用程序,我需要输入我的电子邮件地址和密码。
按照上述步骤,首先需要从数据库中获取该用户的盐值+哈希密码。
问题:
假设我正在使用简单的存储过程,唯一的方式就是这样吗?
然后按照第二步和第三步进行操作:
验证密码的步骤:
1. 从数据库中检索用户的盐值和哈希值。 2. 将盐值添加到输入的密码前,然后使用相同的哈希函数进行哈希处理。 3. 将输入的密码的哈希值与数据库中的哈希值进行比较。如果它们匹配,则密码正确。否则,密码不正确。
但我对此流程有些困惑,例如假设我拥有一个用户表(包含id、name、password和email),并且为了登录某个应用程序,我需要输入我的电子邮件地址和密码。
按照上述步骤,首先需要从数据库中获取该用户的盐值+哈希密码。
问题:
假设我正在使用简单的存储过程,唯一的方式就是这样吗?
CREATE PROCEDURE [dbo].[sp_validate_user]
@us_email VARCHAR (MAX)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT us_id,
us_name,
us_pass,
us_email
FROM Users
WHERE us_email = @us_email
END
然后按照第二步和第三步进行操作:
public static bool ValidatePassword(string inputPassword, string storedPassword)
{
// Extract the parameters from the hash
char[] delimiter = { ':' };
string[] split = storedPassword.Split(delimiter);
int iterations = Int32.Parse(split[ITERATION_INDEX]);
byte[] salt = Convert.FromBase64String(split[SALT_INDEX]);
byte[] hash = Convert.FromBase64String(split[PBKDF2_INDEX]);
byte[] testHash = PBKDF2(inputPassword, salt, iterations, hash.Length);
return SlowEquals(hash, testHash);
}
我的担忧源于这样一个事实,如果我使用从表格中获取的数据创建对象,那么这不会使得其中的信息变得容易受到攻击吗?
此外,这是否意味着使用此验证的唯一方法是仅基于用户名/电子邮件获取所有用户信息,只是为了在运行时检查输入密码和哈希密码是否匹配,并让该用户访问信息?
如果听起来有点困惑,我很抱歉,但若能得到任何见解,那将非常好。