Как изменить алгоритм хеширования в mysql?

#mysql #security

#mysql #Безопасность

Вопрос:

Я только что заметил кое-что о MySQL, чего раньше не замечал.

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

У меня есть локальная база данных сервера MySQL и две другие, размещенные у разных интернет-провайдеров

Если я сделаю следующее

   select MD5('Password');
  select Sha1('Password');
  select Sha2('Password', 224);
  select Password('Password');
 

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

Например, если я это сделаю select MD5('Password') , это даст тот же dc647eb............12b3964 хэш для MD5 независимо от того, на всех моих серверах. Это выглядит немного подозрительно для меня и звучит как дыра в безопасности.

Кто-нибудь заметил это и можно ли что-нибудь с этим сделать?

Комментарии:

1. SET PASSWORD используется для установки паролей сейчас, поэтому PASSWORD() не имеет значения. Какую версию MySQL вы используете?

2. Я получаю разные результаты для каждого из них.

3. Почему это неожиданно? Если бы они не давали один и тот же результат последовательно, как бы вы их использовали?

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

5. Это криптографические подписи , а не уникальные хэши паролей.

Ответ №1:

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

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

Хэши, зависящие от пароля, такие как Bcrypt, о которых вы, возможно, думаете, работают по-другому и выдают случайный вывод. Это делает их более устойчивыми к атакам с использованием грубой силы при подборе пароля. Они также спроектированы так, чтобы быть медленными, часто в десятки, если не в миллионы раз медленнее, чем их аналоги MD5 или SHA.

Вы хотите, BCRYPT(x) чтобы он был случайным и непредсказуемым для любого заданного x , чтобы вы не могли делать выводы x из выходных данных.

Да, использование MD5 или SHA для паролей является огромной проблемой безопасности, особенно если входные данные не обработаны. Просто выполните поиск dc647eb65e6711e155375218212b3964 в вашей любимой поисковой системе и посмотрите, что появляется: он мгновенно «дехэшируется». Вы можете использовать поисковую систему как то, что раньше называлось радужной таблицей.

SHA и MD5 широко использовались для хеширования паролей в основном потому, что это был лучший вариант в то время. Компьютеры также были намного, намного медленнее, а опции графического процессора отсутствовали, поэтому риск компрометации был значительно снижен. Теперь существуют такие инструменты, как Hashcat, которые могут взломать даже «сложные» пароли, если кто-то достаточно неосторожен, чтобы использовать слабый хэш.

Комментарии:

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

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

3. Без обид, и я понимаю крипто-хэши. У меня просто были другие ожидания, вот и все. Я хочу просто ожидать, что MySQL сделает что-то умное и сэкономит мне немного работы. Как я уже сказал, я в C # я обычно пишу / повторно использую свои собственные классы шифрования. Я не так часто использую MySQL / Php, поэтому я никогда раньше не беспокоился об этом и даже не изучал его. Я (ошибочно) предположил, что Oracle и их коллеги знают о подобных вещах намного больше, чем я, поэтому я подумал, что они могут мне немного помочь.

4. «Другое ожидание» — это еще один способ сказать «Я думаю, я не понял». Это нормально, если вы только учитесь, но это огромная проблема, если вы используете свой собственный криптограф. Не делайте этого . Даже специалисты по безопасности знают, что лучше этого не делать.

5. Я согласен. Если мне понадобится что-нибудь сверхпрочное, я сделаю это в asp.net ядро. PHP я использую только для легковесных вещей, даже тогда, теперь, вооружившись этой новой информацией, я добавлю дополнительные функции поверх их криптографической функции, чтобы мое хеширование было специфичным для приложения и немного более надежным.