У меня вопрос о солях.Например, в нашей базе данных есть запись, которая выглядит следующим образом:
Password: YUphoRF70vJEPAOjMmc/9n47hyQ=
Password Format: 1
Password Salt: Vx37L8ItQo3rJzx5gRCxTw==
Я пытаюсь подтвердить этот пароль, но используемый мной метод не работает.
Это метод:
public static string EncodePassword(string pass, string salt)
{
byte[] bytes = Encoding.Unicode.GetBytes(pass);
byte[] src = Encoding.Unicode.GetBytes(salt);
byte[] dst = new byte[src.Length + bytes.Length];
Buffer.BlockCopy(src, 0, dst, 0, src.Length);
Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
byte[] inArray = algorithm.ComputeHash(dst);
return Convert.ToBase64String(inArray);
}
И я передаю это так:
string encodedPasswd = Cryptography.EncodePassword(ClearTxtPassword, DbPasswordSalt);
То, что возвращается, не похоже на пароль в базе данных.
Мне интересно, есть ли что-то еще, что я должен делать с солью?Является ли то, что хранится в БД, тем, что я должен передать методу EncodePassword, или существует какой-то промежуточный шаг, в котором я должен декодировать его перед передачей в качестве параметра?
Я просто не уверен, почему я получаю несоответствие пароля.Согласно web.config сайта, над которым я работаю, это passwordFormat = "Hashed", а в столбце PasswordFormat в БД указано "1", поэтому я знаю, что это SHA1.
Есть ли у вас какие-либо идеи, почему я не получаю правильного соответствия или как продвинуться в выяснении этого? (И да, у меня есть правильный пароль.)
РЕДАКТИРОВАТЬ:
Я попробовал следующий обновленный метод:
public static string EncodePassword(string pass, string salt)
{
byte[] bytes = Encoding.Unicode.GetBytes(pass);
byte[] src = Convert.FromBase64String(salt);
byte[] dst = new byte[src.Length + bytes.Length];
Buffer.BlockCopy(src, 0, dst, 0, src.Length);
Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
byte[] inArray = algorithm.ComputeHash(dst);
return Convert.ToBase64String(inArray);
}
Против моих текущих данных БД, и они все еще не совпадают.Например, я получаю следующие результаты:
passwordText = "administrator"
passwordformat: 1 / SHA1
passwordSaltInDb: "zVhahfmXj9MrOQySyPQ1Qw=="
passwordInDb = "YZ5xRJkNG9erGStAkWJA3hID9vE="
encodedPasswordResults = "DWZ6XRtVMy4l+XSUOKoX8usUOJI="
Можно ли как-нибудь проверить себя в своей среде, чтобы понять, почему я получаю такие разные результаты?