Как конвертировать хэширование паролей из MD5 в SHA?

У меня есть старое приложение, которое имеет пароли пользователей, хранящиеся в базе данных с хэшем MD5. Я хотел бы заменить это чем-то в семье SHA-2.

Я подумал о двух возможных способах достижения этого, но оба кажутся довольно неуклюжими.

1) добавьте логическое поле "флаг". При первой проверке подлинности пользователя после этого замените хэш пароля MD5 хэшем пароля SHA и установите флаг. Затем я могу проверить флаг, чтобы увидеть, хэш ли пароль превращенный.

2) Добавьте второе поле пароля для хранения хэша SHA. При первой аутентификации пользователя после этого хэшируйте пароль с помощью SHA и сохраните его в новом поле (возможно, одновременно удалите хэш MD5). Затем я могу проверить, имеет ли поле SHA значение; это по существу становится моим флагом.

в любом случае аутентификация MD5 должна была бы оставаться на месте в течение некоторого времени для любых пользователей, которые редко входят в систему. И любые пользователи, которые не более активный никогда не будет переключен на SHA.

есть ли лучший способ сделать это?

7 ответов


по существу то же самое, но, возможно, более элегантное, чем добавление дополнительных полей: в фреймворке аутентификации по умолчанию в Джанго, хэши паролей хранятся в виде строк, построенных следующим образом:

hashtype$salt$hash

Hashtype - это sha1 или md5, salt-случайная строка, используемая для соли необработанного пароля, и, наконец, сам хэш. Пример значения:

sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4

вы можете конвертировать все ваши строки MD5 в SHA1, перефразируя их в своей БД, если вы создадите свои будущие пароли, сначала MD5ing их. Проверка паролей требует MD5ing их сначала, но я не думаю, что это большой хит.

PHP-код (логин):

prev: $логин = (как MD5($пароль) == $storedMd5PasswordHash);

после: $логин = (и SHA1(алгоритм MD5($пароль)) == $storedSha1PasswordHash);

работает также с солью, получил первоначальную идею от здесь.


Я думаю, что у тебя уже есть лучшие возможности. Мне нравится #1 больше, чем #2, так как нет никакой пользы для md5 после установки sha.

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


нет-в основном вам придется сохранить MD5 на месте, пока все пользователи, о которых вы заботитесь, не будут преобразованы. Это просто природа хеширования - у вас недостаточно информации, чтобы снова выполнить преобразование.

другим вариантом, соответствующим другим, было бы сделать поле пароля эффективно самоописывающимся, например

MD5:(md5 hash)
SHA:(sha hash)

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

вы хотите сделать начальное обновление, чтобы все текущие пароли объявили себя как MD5.


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

первый эффективно "причуды-режим" ваша кодовая база и только гарантирует, что новые пользователи имеют лучший опыт SHA.


Если MD5 не засолены, вы всегда можете использовать таблицы сайта расшифровки / радуги, такие как:http://passcracking.com/index.php чтобы получить пароли. Вероятно, проще просто использовать метод re-encode.


Да, вы должны знать реальный пароль, прежде чем конвертировать его в sha-1..

Если вы хотите найти реальный пароль из зашифрованной строки md5, вы можете попробовать md5pass.com