2013-02-13 5 views
1

Я храню свой password в столбце таблицы базы данных с кодом string. Перед хранением в базе данных я делаю это Hash encoded используя C# метод ниже:Сравнение паролей, кодированных хешем

public static string Md5Encrypted(string password) 
     { 
      byte[] pass = Encoding.UTF8.GetBytes(password); 
      MD5 md5 = new MD5CryptoServiceProvider(); 
      string strPassword = Encoding.UTF8.GetString(md5.ComputeHash(pass)); 
      return strPassword; 
     } 

Теперь я хочу compare него, вставляя новый пароль.

Для этого я беру запись конкретного пользователя из базы данных и получая его существующий закодированный пароль в строке. Если я использую тот же пароль, то он также не подходит. Например, если я прохожу adgjl135 в качестве пароля, он кодируется как Pb�ZsÈU��}��, но из базы данных я получаю Pb?ZsÈU??}??, но очевидно, что они не совпадут. Тогда как мне их сравнить? Есть идеи??

+0

Вы неправильно храните пароли. Либо используйте тип данных байтового массива в базе данных, либо кодируйте хэш как шестнадцатеричные цифры/base64 перед его сохранением. (Почему вы считаете, что MD5 что-то является допустимой строкой UTF-8?) – millimoose

+0

Также не очень безопасно хранить пароли в базе данных несолены. Лучше, чем unhashed, но в случае, когда ваша база данных будет украдена, люди с паролями, доступными в радужных таблицах, будут подвержены риску заражения. – millimoose

+1

@AndreLoker Его отличия .. Я хочу сравнить пароли сейчас, так как у меня нет метода его декодирования. – Dev

ответ

6

Не делайте этого:

Encoding.UTF8.GetString(md5.ComputeHash(pass)) 

Результатом вычисления хэша является не UTF-8 кодировкой текста. Это двоичные данные. Когда вы пытаетесь интерпретировать его так, как если бы это была строка с кодировкой UTF-8, вы теряете данные - следовательно, проблема.

Таким образом, либо храните его как двоичные данные, либо преобразуйте его в шестнадцатеричный или base64, оба из которых могут использоваться для представления произвольных двоичных данных без потерь.

(В качестве важного в сторону, вы должны не просто использовать MD5 хэш пароля. - особенно не без соли Но это отдельный разговор, один вы должны определенно обратить внимание на, и один, где я не компетентен говорить авторитетно.)

+0

Просто избили меня! : P –

+0

ОК. Теперь любой метод, с помощью которого я могу их сравнить? Я не могу изменить этот метод, поскольку у нас уже существует множество пользователей. – Dev

+2

@Dev: Вы должны * изменить. Вы уже потеряли данные. Работая вокруг этого, вы оставите вас еще более уязвимыми, чем если бы вы правильно использовали MD5. По сути, ваш код сломан - и чем дольше он будет сломан, тем более болезненным будет исправление. Возможно, вам все равно придется сбросить пароль каждого. Вы должны принять это как возможность исправить алгоритм, который вы используете, а также хранилище ... –

0

Как вы, вероятно, заметили, , который обычно используется для выражения «недопустимого символа» в UTF-8, заменяется обычным «?», в вашей базе данных. Поэтому вы можете сравнить то, что осталось от паролей, если вы считаете эти два символа равными.

Смежные вопросы