Как я могу сделать MD5 более безопасным?Или это действительно необходимо? - PullRequest
2 голосов
/ 13 мая 2011

Я храню имя пользователя и пароль в базе данных MySQL, и они хэшируются с использованием MD5.Тем не менее, я использую только стандартную функцию PHP без каких-либо изменений.Теперь я прочитал, что MD5 сломан.Как дела?Вы запускаете его несколько раз через другой механизм хеширования или добавляете некоторую форму соли?

Ответы [ 9 ]

11 голосов
/ 13 мая 2011

Я поражен тем, как люди прыгают на подножку «черт, он сломан, я не буду его использовать!», Не делайте ту же ошибку.

Вы не можете сделать MD5 лучше. Даже использование SHA-1 уязвимо к тем же типам атак, что и MD5. Использование bcrypt будет использовать ОЧЕНЬ больше ЦП, чем алгоритмы MD5 и SHA.

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

Вам нужно знать, почему MD5 считается "сломанным".

  • Поскольку можно быстро вычислить радужную таблицу паролей длиной до 6 символов .

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

  • Из-за столкновений .

Что такое столкновение? Если вы даете хеш-функции две разные строки и она возвращает один и тот же хеш - это коллизия. Как это перевести на веб и хэширование паролей для входа в систему? Если у вас одинаковый хеш для user1 / password1 и user2 / password2 - они могут войти в систему как кто-то другой. Вот где столкновения играют роль в безопасности.

Причина, по которой MD5 считается неработающим, заключается в том, что MD5 возвращает одинаковый хэш для строк, которые отличаются небольшим процентом. И не легко вычислить, какой может быть эта строка! С математической точки зрения - да, она «сломана», потому что если ваша строка имеет 100 символов и отличается от другой строки на 10 символов (разница 10%) - вы получите тот же хеш.

То, что относится к MD5, применимо ко ВСЕМ алгоритмам хеширования. В конце концов, все они не имеют бесконечного количества возможных хэшей. Однако некоторые из них (например, MD5) имеют меньше возможных хэшей и выполняются быстрее.

В конце концов, если кто-то попал в вашу базу данных - у вас есть большая проблема, чем использование MD5 вместо bcrypt или SHA1.

6 голосов
/ 13 мая 2011

Добавить соль для каждого сохраненного пароля, которая не равна каждому паролю

1 голос
/ 13 мая 2011

Возможно, вам лучше использовать , используя bcrypt для хранения паролей , чтобы предотвратить атаки радужных таблиц на случай, если плохие парни овладеют вашей БД.

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

1 голос
/ 13 мая 2011

Есть пара вещей, которые вы должны сделать.

  1. Используйте SHA вместо MD5.SHA более криптографически безопасен, чем MD5.Чем больше бит, тем лучше!
  2. Используйте соль.Это усложняет атаки радужных таблиц .
  3. Укрепление вашего ключа путем вычисления хеша следующим образом:

:

function strenghtened_hash( $password, $salt, $n ) {
    $crypted = sha( $password . $salt );
    for( $i = 0; $i < $n; $i++ ) {
        $crypted = sha( $crypted . $password . $salt );
    }
    return $crypted;
}

Теперь вы должны быть в хорошей форме!

1 голос
/ 13 мая 2011

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

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

1 голос
/ 13 мая 2011

Просто используйте MD5("yoursite.com".$string);

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

0 голосов
/ 13 января 2012

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

0 голосов
/ 13 мая 2011

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

Затем, чтобы проверить пароль, вы делаете что-то вроде этого:

<?php 
     $crypted = md5($salt.$passwordFromForm);

     if($crypted == $passwordFromDB) {
         // user logged on
     }
?>
0 голосов
/ 13 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...