Есть ли какие-либо проблемы безопасности при использовании существующих MD5-хешей с PHPass? - PullRequest
7 голосов
/ 04 сентября 2011

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

Я нашел достаточно простое решение, но, учитывая мою предыдущую ошибку, я 'Я хотел бы убедиться, что я не совершаю столь же ужасную ошибку из-за невежества.

Мое решение заключается в следующем:

Изменить

  1. md5($_POST['pass'])
  2. проверка хэшированного пароля md5 к значению базы данных

К

  1. md5($_POST['pass'])
  2. передача хэшированного пароля md5 к $hasher->HashPassword()
  3. используйте $hasher->CheckPassword(), чтобы проверить повторно хэшированный пароль по значению из DB

Просто для ясности, я только повторно хэширую версию md5, потому что это то, что у меня уже есть вDB.Он не предназначен в качестве дополнительной меры безопасности (хотя, если это так, это здорово!).

Ответы [ 4 ]

4 голосов
/ 04 сентября 2011
  1. Проблема MD5 () ПУТЬ преувеличена на этом сайте сообщества программистов-энтузиастов.В этом алгоритме хеширования нет ничего плохого, особенно по сравнению с другими частями обычного приложения новичка.Использование методов phpass на обычном PHP-сайте похоже на использование безопасного замка на бумажной двери соломенной хижины.

  2. Самое важное в защите паролей от virtual вероятность быть украденным и использованным против того же пользователя на других сайтах (о, мой!) составляет надежность пароля и соль.Не алгоритм хеширования сам по себе. Нет Техника хеширования защитит глупый проход как "1234" или "Джо".
    Итак, md5 + strong password + average salt лучше, чем usual password + phpass

  3. Существуетне единственная причина для phpass существующего хеша md5
    Разумный алгоритм миграции -

    • . Проверьте эту запись пользователя на наличие нового флага хеширования.
    • если он установлен -
      • перейти к phpass auth
    • , если нет:
      • md5 ($ _ POST ['pass'])
      • проверка хэшированного пароля md5 к значению базы данных
      • , если правильно:
        • phpass ($ _ POST ['pass'])
        • сохранить результат в базе данных
        • установить новый флаг хеширования для этой записи
    • сделано
1 голос
/ 09 сентября 2011

Здесь вы получите довольно сомнительный совет, поэтому вы можете спросить о IT Security .Вопреки сказанному некоторыми людьми, алгоритм хеширования паролей имеет значение;вы хотите использовать соление и медленный хеш, такой как bcrypt, scrypt или PBKDF2.См .: Какой метод хеширования паролей следует использовать? , Рекомендуют ли какие-либо эксперты по безопасности bcrypt для хранения паролей? , Как безопасно хэшировать пароли? , Наиболее безопасный алгоритм хеширования паролей? .PHPass - хорошая библиотека.

Чтобы перенести пользователей на PHPass, вам нужно иметь две базы данных хэшей паролей: старую (с хэшами MD5) и новую (с хешами PHPass).Первоначально новый будет пустым.Когда пользователь входит в систему, проверьте, есть ли у вас запись для него в вашей старой базе данных хэшей паролей (с хэшами MD5), и если вы не найдете там записи, посмотрите новую базу данных хэшей паролей (с хэшами PHPass).Если вы найдете запись в старой базе данных, вы захотите использовать MD5 для хеширования и проверки их пароля.Если это правильно, вам нужно будет хэшировать их пароль в открытом виде с помощью PHPass, вставить его в новую базу хэшей паролей и удалить их из старой базы хэшей паролей.Если вы не нашли запись в старой базе данных, вы можете проверить наличие записи в новой базе данных и проверить действительность их пароля с помощью PHPass.По сути, при следующем входе в систему вы постепенно переводите каждого пользователя из хэша старого стиля в новый. Это имеет смысл?

1 голос
/ 04 сентября 2011

Проблема, о которой вы говорите, на самом деле не специфична для PHPass, но хэширует пароли в целом.Это в основном просто двойное хеширование.Об этой теме уже говорилось в другом вопросе: Является ли "двойное хеширование" пароля менее безопасным, чем простое хеширование?

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

Если вы не хотите иметь дело с двойным хэшированиемвы можете просто добавить поле флага в таблицу базы данных users и установить его равным true для всех новых пользователей, которые присоединяются после установки новой формы хэширования PHPass.Затем, когда пользователь входит в систему, если у него не установлено поле флага, используйте старую систему хеширования или измененную версию, которую вы подробно описали в своем вопросе.Если у них есть поле флага, вы можете использовать любой новый процесс хеширования, который вы настроили.

Обновление: На самом деле, опираясь на это, вы можете попробовать установить этот флаг,и как только они войдут в систему под старой системой, если это совпадение, в ваших $_POST данных все равно будет сохранен их нехэшированный пароль, так что вы сможете запустить его через новую настройку хеширования и сохранить новый хеш, а затем установите флаг true, так как они были обновлены до нового метода хеширования.С этого момента они будут использовать новый метод хеширования.

0 голосов
/ 04 сентября 2011

Мой метод гарантирует, что пароль имеет длину не менее 8 символов и содержит неслучайные символы мусора («мусор» означает, возможно, непечатные / нулевые символы):

function pass_hash ($password) {
    # take first 8 characters of the raw md5 hash
    $hashslice = substr(md5($password, true), 0, 8);
    # add it to the password and hash again
    return md5($password . $hashslice);
}

Если вам не нравится md5, просто используйте sha1, принцип тот же.

...