加密比较登录时的哈希和盐渍密码

时间:2013-02-27 19:47:41

标签: c# encryption hash salt

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

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 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

我写了一篇关于盐渍密码等效方案如何工作的快速教程。但是,基于您提出问题的事实,我应该提醒您这只是确保安全登录过程的第一步。如果您是初学者,您应聘请安全专家或购买现成的解决方案,而不是尝试自己动手。制造使系统不安全的不明显错误的方法数量巨大

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

有几个步骤可以正确执行此操作。

首先你需要3件事:

  1. 用户提供的密码。 (我们称之为 p
  2. 您创建的随机字符串。这被称为盐(我们称之为 s
  3. 加密哈希函数(称之为 h (x))
  4. 通过上述三件事,我们可以计算 h '这是我们想要存储的内容: h '= h s + p

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

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

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

相关问题