繁体   English   中英

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

[英]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错误,使系统不安全的是巨大的

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

如果您所需要的只是一种比较密码的方法,那么可能会有所帮助: 加密/解密

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

首先,您需要三件事:

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

通过以上三件事,我们可以计算出H'这就是我们想要存储:H = H(S + P)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM