Как я могу проверить незашифрованный пароль с помощью алгоритма хеширования? - PullRequest
1 голос
/ 23 января 2011

У меня вопрос о солях.Например, в нашей базе данных есть запись, которая выглядит следующим образом:

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="

Можно ли как-нибудь проверить себя в своей среде, чтобы понять, почему я получаю такие разные результаты?

Ответы [ 2 ]

1 голос
/ 23 января 2011

Если вы передаете соль точно так, как она хранится в базе данных, то вы имеете дело с строкой в ​​кодировке Base-64. Чтобы преобразовать его в массив byte[], вы должны использовать Convert.FromBase64String вместо Unicode.GetBytes. Что-то вроде этого:

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);
}

Кстати, хотя в вашем вопросе неоднократно упоминается расшифровка пароля, мне кажется, что вы просто пытаетесь проверить незашифрованный пароль по сохраненному хешу. Если это так, то приведенный выше код должен подойти.

Если вы действительно пытаетесь расшифровать сохраненный хеш, не беспокойтесь! Хеш не является зашифрованной версией пароля, поэтому расшифровать его невозможно.

0 голосов
/ 23 января 2011

SHA1 не легко расшифровать, что является одной из причин его использования для хранения паролей.Почему вы пытаетесь расшифровать пароли?

...