Могу ли я повысить безопасность хешированных паролей MD5, соляризовав существующий хеш MD5 и хэшируя результат, используя Scrypt или PBKDF2 HMACSHA256?

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

Первый вариант заключается в переходе пользователей на новую схему хеширования (Salt + Scrypt или PBKDF2 HMACSHA256), когда они входят в систему и деактивируют старых пользователей через определенный период времени, поэтому им приходится использовать функцию восстановления пароля, которая автоматически обновляет их хэш.

Другой вариант, который позволил бы мне мгновенно обновить всех, состоял бы в том, чтобы взять существующие хеши MD5, добавить новое случайное значение соли для каждого, а затем хэшировать результат с помощью новой схемы хеширования (Salt + Scrypt или PBKDF2 HMACSHA256) и сохранить это значение. в базу данных и удалите старое значение.

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

Безопасно ли солить и перефразировать существующие хеши? MD5 настолько сломан, что я могу запустить скрипт для дешифрования паролей и перефразирования их по новой схеме?

Или, может быть, лучшее решение - сделать комбинацию обоих вариантов? Таким образом, мне не нужно оставлять существующие хеши MD5 незащищенными в базе данных, и я могу перенести пользователей в новую систему на некоторое время?

2 ответа

Решение

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

Если бы я был вами, я бы использовал оба перечисленных вами метода (потому что, как вы упомянули, быстрое перемещение паролей важно в случае взлома вашей БД). Во-первых, я перебил бы все грубые пароли MD5 и перевел их в новый формат. Я делал это в прошлом, и, безусловно, лучшие результаты были при использовании HashCat (предпочтительно Cuda или OCL, поскольку они используют GPU и работают в 200 раз быстрее). Если Hashcat слишком сложен (кривая обучения может быть крутой), то попробуйте John the Ripper. Это намного медленнее, чем HashCat, но намного проще в использовании.

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

РЕДАКТИРОВАТЬ:

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

Это на самом деле очень гениальная идея, которую вы имели. Обычно я бы имел:

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

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

Использование алгоритма быстрого хеширования в качестве шага предварительной обработки перед " хешем " реального пароля не является неслыханным - и даже может быть полезным.

  • BCrypt имеет известное ограничение длины пароля в 72 байта (71 utf-8 символов и затем нулевой терминатор). Dropbox применяет SHA2-512 к входящему незашифрованному паролю перед запуском его через bcrypt. Запустив длинный пароль через хеш, они преодолевают ограничение в 71 символ.
  • Это не только преодолевает ограничение длины пароля (избегая необходимости урезать или ограничивать размер пароля), но также может предотвратить атаку типа "отказ в обслуживании", когда кто-либо вводит чрезвычайно длинный пароль. BCrypt и Scrypt подвержены атакам с более длинными паролями (я не знаю об Argon2).

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

Я не знаю, как вы храните хеши MD5. MD5 128-битный. Предполагая, что вы храните его в Base64, вы можете легко распознать его:

  • MD5: nMKuihunqT2jm0b8EBnEgQ==

Желаемая конечная цель - что-то вроде scrypt:

  • MD5: nMKuihunqT2jm0b8EBnEgQ==
  • Скрипт: $s0$e0801$epIxT/h6HbbwHaehFnh/bw==$7H0vsXlY8UxxyW/BWx/9GuY7jEvGjT71GFd6O4SZND0=

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

MD5 + скрипт

что-то вроде:

  • MD5: nMKuihunqT2jm0b8EBnEgQ==
  • MD5 + scrypt: $md5s0$e0801$eX8cPtmLjKSrZBJszHIuZA==$vapd0u4tYVdOXOlcIkFmrOEIr1Ml2Ue1l2+FVOJgbcI=
  • Скрипт: $s0$e0801$epIxT/h6HbbwHaehFnh/bw==$7H0vsXlY8UxxyW/BWx/9GuY7jEvGjT71GFd6O4SZND0=

Теперь вы можете распознать используемый алгоритм на основе сохраненного хэша и можете обновлять пароли по частям.

Другие вопросы по тегам