我有一个简单的密码加密器,当用户注册时,它给我一个哈希/盐渍密码存储在我的数据库中。代码:
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);
}
当用户登录时,我认为我不能简单地通过此代码返回输入的密码并进行比较,因为它会给我一个不同的结果。如何简单地将存储的密码与输入的登录密码进行比较?
答案 0 :(得分:5)
创建帐户后,您将拥有password hash
列,该列将由GenerateHashWithSalt(password, salt);
填充,其中密码由他们提供,然后随机生成盐。然后将盐与密码哈希一起存储。
然后,当您需要查看用户名/密码是否有效时,您可以使用storedpassword == GenerateHashWithSalt(providedPassword, saltFromDb)
或其他类似内容。如果它们相同,那么您就知道它们输入了正确的密码
答案 1 :(得分:2)
我写了一篇关于盐渍密码等效方案如何工作的快速教程。但是,基于您提出问题的事实,我应该提醒您这只是确保安全登录过程的第一步。如果您是初学者,您应聘请安全专家或购买现成的解决方案,而不是尝试自己动手。制造使系统不安全的不明显错误的方法数量巨大。
答案 2 :(得分:0)
如果你只需要一种比较密码的方法,也许这会有所帮助:encryption/decryption
答案 3 :(得分:0)
有几个步骤可以正确执行此操作。
首先你需要3件事:
通过上述三件事,我们可以计算 h '这是我们想要存储的内容: h '= h ( s + p )
永远不会存储用户的密码。我们只将 s 和 h '存储在我们的数据库中。
盐不需要加密。它只需要对数据库中的每个密码都是唯一的。
当用户以后尝试再次登录时,您将使用存储在数据库中的原始盐重新计算 h '。如果新 h '等于数据库中的内容,那么用户的密码是相同的。