'Недопустимая строка Base64 при проверке хешированного пароля - PullRequest
0 голосов
/ 02 июля 2018

Итак, я запускаю следующую настройку, когда пользователь входит в систему:

Когда создается новый пользователь, пароль получает сгенерированный хеш и объединяется с вновь созданным 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 голосов
/ 02 июля 2018

HashedPassword + Salt хранится в столбце

Это, вероятно, основная проблема. Вам не нужно предоставлять или обрабатывать соль. См. этот ответ .
Вам не нужен метод GetSalt().

Вы не можете просто объединить 2 строки base64, декодер не знает, как с этим справиться.

0 голосов
/ 02 июля 2018

Формат Base64 хранит 6 бит на символ. Который, поскольку байты составляют 8 битов, иногда в конце требуется некоторое заполнение. Один или два = символа добавляются. = не используется иначе.

Если вы объединяете две строки Base64 в соединении, возможно, есть некоторые отступы. Неверное заполнение в середине строки Base64.

Вместо этого объедините байтовые массивы, а затем закодируйте.

...