'验证哈希密码时不是有效的Base64字符串

时间:2018-07-02 12:54:54

标签: c# security login passwords

因此,一旦用户登录,我将运行以下设置:

创建新用户时,密码将获取一个生成的哈希值,并与新生成的Salt串联。 HashedPassword + Salt存储在与Salt列分开的列中。然后,我调用方法VerifyHashedPassword(string storedHashedPass, String password) storedHashedPass是存储的哈希密码(带有盐),password是用户在登录时输入的明文密码,其中包含从存储中检索到的盐的串联。

但是当我尝试实现此功能时,它会抛出'System.FormatException'

有人可以帮我弄清楚我在做什么错吗?

 public static bool VerifyHashedPassword(string hashPassword, String password)
 {
      return System.Web.Helpers.Crypto.VerifyHashedPassword(hashPassword, password);
 }

 public static string GetSalt()
 {
      var random = new RNGCryptoServiceProvider();

      int max_length = 32;

      byte[] salt = new byte[max_length];

      random.GetNonZeroBytes(salt);

      return Convert.ToBase64String(salt);
  }

 public static string hashPassword(string password)
 {
      return System.Web.Helpers.Crypto.HashPassword(password ?? "");
 }

2 个答案:

答案 0 :(得分:1)

  

HashedPassword + Salt存储在列中

这可能是根本问题。您不需要提供或处理盐。参见this answer
您不需要GetSalt()方法。

您不能简单地连接2个base64字符串,解码器不知道如何处理。

答案 1 :(得分:0)

Base64格式每个字符存储6位。由于字节为8位,因此有时最后需要填充。附加一个或两个postback字符。否则不使用=

如果在连接处连接两个Base64字符串,则可能会有一些填充。将填充放在Base64字符串的中间无效。

而是连接字节数组,然后进行编码。