1

我有一个简单的密码加密器,当用户注册时,它会给我一个散列/加盐密码以存储在我的数据库中。代码:

public static string GenerateHashWithSalt(string enteredPassword, string enteredSalt)
    {
        string sHashWithSalt = enteredPassword + enteredSalt;
        byte[] saltedHashBytes = Encoding.UTF8.GetBytes(sHashWithSalt);
        System.Security.Cryptography.HashAlgorithm algorithm = new System.Security.Cryptography.SHA256Managed();
        byte[] hash = algorithm.ComputeHash(saltedHashBytes);
        return Convert.ToBase64String(hash);
    }

当用户登录时,我认为我不能简单地将输入的密码放回这段代码并进行比较,因为它会给我一个不同的结果。如何简单地将存储的密码与输入的登录密码进行比较?

4

4 回答 4

5

创建帐户后,您将有一password hash列,该列将由他们提供密码的位置填充GenerateHashWithSalt(password, salt);,然后随机生成盐。然后盐将与密码哈希一起存储。

然后,当您需要查看用户名/密码是否有效时,您会使用storedpassword == GenerateHashWithSalt(providedPassword, saltFromDb)或类似的。如果结果相同,那么您就知道他们输入了正确的密码

于 2013-02-27T19:51:05.003 回答
2

I wrote up a quick tutorial on how salted-hashed-password-equivalent schemes work. However, based on the fact that you are asking the question I should caution you that this is only the first step in ensuring a secure logon process. You should hire a security expert or purchase an off-the-shelf solution rather than attempting to roll your own if you are a beginner at this. The number of ways to make an inobvious mistake that makes the system insecure is enormous.

http://blogs.msdn.com/b/ericlippert/archive/tags/salt/

于 2013-02-27T20:38:11.203 回答
0

如果您只需要一种比较密码的方法,也许这会有所帮助:加密/解密

于 2013-02-27T20:04:25.470 回答
0

有几个步骤可以正确地做到这一点。

首先你需要三样东西:

  1. 用户提供的密码。(我们称之为p
  2. 您创建的随机字符串。这被称为盐(我们称之为s
  3. 加密哈希函数(称为h (x))

通过以上三件事我们可以计算出我们要存储的h ' = h ( s + p )

永远不会存储用户的密码。我们只在我们的数据库中存储sh '。

盐不需要加密。它只需要对数据库中的每个密码都是唯一的。

当用户将来再次尝试登录时,您将使用存储在数据库中的原始盐重新计算h ' 。如果新的h ' 等于数据库中的值,则用户的密码相同。

于 2013-02-27T20:15:14.830 回答