Подтвердить что ты не робот

Переход от несоленых к соленым паролям MD5

У меня есть сайт LAMP (PHP), который становится популярным.

Я играл в нее безопасно, сохраняя пароли пользователей в виде хешей md5.

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

Что я могу сделать?

Я не хочу, чтобы каждый вводил новый пароль.

4b9b3361

Ответ 1

Вы можете сделать "двухэтапное хеширование" вместо создания хеша за один шаг.

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

Обычный процесс засоления

соль + PWD → хеш

Вы можете сделать что-то вроде: PWD → Hash → UserID + Hash → Hash

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

Ответ 2

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

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

Ответ 3

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

Теперь, когда кто-то входит в систему и устанавливается флаг, аутентифицируйте их с помощью нового хэша.

Ответ 4

Почему бы не добавить новый столбец new_pwd в свою пользовательскую таблицу, в которой хранится результат md5($originallyHashOfPwd . $salt). Затем вы можете прекомпотировать new_pwd и после этого скорректировать свою проверку входа, чтобы сравнить результат md5(md5($entered_pwd) . $salt) с тем, что в new_pwd. Когда вы закончите переключение проверки входа в систему, удалите старый столбец.

Это должно остановить атаки стиля радуги.

Ответ 5

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

$newHash = md5($salt.$oldHash);

Для новых паролей вам необходимо использовать:

$hash = md5($salt.md5($password));

Ответ 6

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

Чтобы преобразовать их в PHP, сначала проверьте длину строки хранимого пароля. Если это 32 символа, проверьте пароль, используя старый метод, а затем напишите новый, используя SHA1 в базе данных.

Если я правильно помню, именно так WordPress справился с этой проблемой.

Ответ 7

Два варианта здесь

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

Насколько я вижу, нет другого способа восстановить пароли.

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

Ответ 8

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

Ответ 9

Вы можете перенести пароли, добавив столбец в свои таблицы, чтобы сохранить новый формат.

Когда пользователь успешно войдет в систему, если новый столбец пуст, поместите там более сильный пароль и выпустите исходный столбец. Если в новом столбце есть запись, сравните вход с этим значением.

Ответ 10

Соль оригинального хеша, как упоминалось другими. Здесь всего несколько указателей:

  • Соли лучше, чем дольше. Кроме того, если они содержат больше, чем просто [a-z0-9], но длина лучше в первую очередь.
  • Если у кого-то уже есть копия вашей БД и вы переименовываете те же пароли с солью, пересохнуть старый хэш с солью не получится. Вместо этого вы действительно должны заставить пользователей создать новый пароль.
  • Вам следует сопоставлять новые пароли (и пароли для соления) против различных списков наиболее часто используемых паролей. Они используются в атаках "грубой силы". Запросить/принудительно изменить пароль пользователя.

Ответ 11

Если вы отодвигаетесь от MD5, вам следует пропустить просто соление и перейти к еще лучшей технике, называемой растяжкой. В частности, вы должны использовать bcrypt (реализованный как PHPASS с php).

Вот отличная ссылка на почему bcrypt: http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html

И вот короткий How To: 1. Загрузите пакет phpass: http://www.openwall.com/phpass/ 2. Посмотрите на test.php для примеров, подобных приведенным ниже:

require 'PasswordHash.php';
$t_hasher = new PasswordHash(8, FALSE);
$correct = 'plaintextpassword';
$hash = $t_hasher->HashPassword($correct);
$check = $t_hasher->CheckPassword($correct, $hash);

Если $check === true (это выше), то пароль правильный. Если ваш пароль "привет", вы можете использовать его с помощью HashPassword, помещать хэш в базу данных, а когда пользователь входит в систему, вызовите CheckPassword (userenteredpassword, hashInDb), чтобы узнать, правильно ли пароль.

Ответ 12

К сожалению, ваш единственный способ - сообщить своим пользователям обновить свои пароли.

вы также можете генерировать случайные пароли, но это та же проблема.

изменить

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

md5(md5($new_password).$salt).':'.$salt

для обновления старых паролей используйте

md5($old_password.$salt).':'.$salt

чтобы проверить правильность предоставленного пароля, просто используйте

list($stored_password, $salt) = explode(':', $salted_password);
if(md5(md5($provided_password).$salt) == $stored_password) {
  // you are now logged in
}