[英]Encryption Comparing Hashed&Salted Password upon Login
我有一个简单的密码加密器,当用户注册时,它为我提供了一个散列/加盐的密码,可以存储在我的数据库中。 码:
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);
}
当用户登录时,我想我不能简单地通过此代码放回输入的密码并进行比较,因为这样做会给我带来不同的结果。 如何简单地将存储的密码与输入的登录密码进行比较?
创建帐户后,您将拥有一个password hash
列,该列将由GenerateHashWithSalt(password, salt);
填充GenerateHashWithSalt(password, salt);
由他们提供密码,然后随机生成盐。 然后将盐与密码哈希一起存储。
然后,当您需要查看用户名/密码是否有效时,可以使用storedpassword == GenerateHashWithSalt(providedPassword, saltFromDb)
或类似方法。 如果输入的密码相同,则说明您输入了正确的密码
我写了一篇有关盐渍散列密码等效方案如何工作的快速教程。 但是,基于您正在询问的事实,我应该警告您, 这只是确保安全登录过程的第一步 。 如果您是初学者,则应聘请安全专家或购买现成的解决方案,而不要尝试自己动手做。 路数作出inobvious错误,使系统不安全的是巨大的 。
如果您所需要的只是一种比较密码的方法,那么可能会有所帮助: 加密/解密
有几个步骤可以正确执行此操作。
首先,您需要三件事:
通过以上三件事,我们可以计算出H'这就是我们想要存储:H = H(S + P)
用户密码永远不会存储。 我们仅将s和h '存储在我们的数据库中。
盐不需要加密。 对于数据库中的每个密码,它只需要唯一。
当用户将来尝试再次登录时,您将使用存储在数据库中的原始盐重新计算h '。 如果新的h '等于数据库中的值,则用户的密码是相同的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.