2

我已经使用这种方法来获取加盐密码。我不知道如何将存储的加盐密码与用户登录时输入的密码进行比较

string salt = GetRandomSalt();
 string passwordHash = HashPassword(txtPassword.Text, salt);
 IdentityResult result = manager.Create(user, passwordHash);


    public String GetRandomSalt(Int32 size = 12)
    {
        var random = new RNGCryptoServiceProvider();
        var salt = new Byte[size];
        random.GetBytes(salt);
        return Convert.ToBase64String(salt);
    }
    public String HashPassword(String password, String salt)
    {
        var combinedPassword = String.Concat(password, salt);
        var sha256 = new SHA256Managed();
        var bytes = UTF8Encoding.UTF8.GetBytes(combinedPassword);
        var hash = sha256.ComputeHash(bytes);
        return Convert.ToBase64String(hash);
    }

我的应用程序是 ASP.net MVC 4 并使用身份框架来提供角色和用户

我尝试在登录表单中使用以下代码,但它不起作用。我想这是因为 manager.Create 再次对加盐哈希进行哈希处理。如何解决?

登录.aspx

  bool pwmatch = VerifyPassword(txtUserName.Text, txtPassword.Text);


    public String HashPassword(String password, String salt)
    {
        var combinedPassword = String.Concat(password, salt);
        var sha256 = new SHA256Managed();
        var bytes = UTF8Encoding.UTF8.GetBytes(combinedPassword);
        var hash = sha256.ComputeHash(bytes);
        return Convert.ToBase64String(hash);
    }

    private bool VerifyPassword(string suppliedUserName, string suppliedPassword)
    {
        var userStore = new UserStore<IdentityUser>();
        userStore.Context.Database.Connection.ConnectionString =
            ConfigurationManager.ConnectionStrings["MUSICConnectionString"].ConnectionString;

        var manager = new UserManager<IdentityUser>(userStore);

        var user = manager.FindByName(suppliedUserName);
        bool passwordMatch = false;
        string dbPasswordHash = user.PasswordHash;
        int saltSize = 12;
        string salt =dbPasswordHash.Substring(dbPasswordHash.Length - saltSize);
        string hashedPasswordAndSalt =HashPassword(suppliedPassword, salt);
        // Now verify them.
        passwordMatch = hashedPasswordAndSalt.Equals(dbPasswordHash);
        return passwordMatch;
    }
4

2 回答 2

1

主要思想是为特定用户/密码使用盐,但在用户再次登录时能够保留使用过的盐。以下是执行此操作所需的逻辑步骤:

存储密码

  • 生成一个长随机盐。
  • 将盐添加到密码并使用标准密码散列函数对其进行散列。
  • 将盐和哈希都保存在用户的数据库记录中。

验证密码

  • 从数据库中检索用户的盐和哈希。
  • 将盐添加到给定密码并使用相同的散列函数对其进行散列。
  • 将给定密码的哈希值与数据库中的哈希值进行比较。如果它们匹配,则密码正确。否则,密码不正确。

参考:https ://crackstation.net/hashing-security.htm

于 2018-09-26T08:32:47.513 回答
1

请注意 Identity 中的默认哈希实现是如何工作的 ASP.NET Identity 默认密码哈希,它是如何工作的,它是否安全?

ASP.NET Identity 已经包含一个验证散列密码的方法 - 它称为VerifyHashedPassword您应该能够使用它(除非您以特定方式从以前的 asp.net 成员身份迁移)

于 2016-01-23T08:18:13.427 回答