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

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

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

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

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

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

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

Ответ 1

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

hashtype$salt$hash

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

sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4

Ответ 2

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

php-code (логин):

пред: $ login = (md5 ($ password) == $storedMd5PasswordHash);

после того, как: $ login = (sha1 (md5 ($ password)) == $storedSha1PasswordHash);

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

Первый эффективный "quirks-mode" ваш код и только гарантирует, что у новых пользователей будет лучший опыт SHA.

Ответ 6

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

Ответ 7

Да, сначала вы должны знать реальный пароль, прежде чем преобразовать его в ша-1.

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