Пароль MD5 дважды

Я знаю, что безопасность MD5 в последнее время находится под вопросом, и по этой причине многие люди используют соль (я вообще этого не понимаю, кстати), но мне было интересно, хотите ли вы легко реализовать безопасную систему на php, можете ли вы просто md5 что-нибудь дважды ?

например test> 098f6bcd4621d373cade4e832627b4f6> fb469d7ef430b0baf0cab6c436e70375

Итак, в основном:

$val = 'test';
$val = md5($val);
$val = md5($val);

Сможет ли это решить всю проблему радужной безопасности? Есть ли простой / надежный способ создания безопасных паролей базы данных на php?


person NoviceCoding    schedule 27.12.2010    source источник
comment
Re salt, см. Здесь хороший ответ: stackoverflow.com/questions/4351702/   -  person Pekka    schedule 27.12.2010
comment
hash('sha256', $s); доступен большинству разработчиков, поэтому поддержка передовых методов не должна быть проблемой.   -  person zzzzBov    schedule 27.12.2010
comment
Прочтите эту статью, чтобы получить больше информации: benlog.com/articles/2008 / 06/19 / dont-hash-secrets   -  person deceze♦    schedule 27.12.2010
comment
Re noob proof way: Нет. Пока вы не понимаете зачем вы это делаете, вы всегда можете облажаться. ; о)   -  person deceze♦    schedule 27.12.2010
comment
См. Также: stackoverflow .com / questions / 1191112 / - и ссылки в этом вопросе - для обсуждения засолки.   -  person Jonathan Leffler    schedule 27.12.2010
comment
Нет, дважды недостаточно, но какое-то значительное количество, например, 1000, было бы нормально.   -  person Your Common Sense    schedule 27.12.2010


Ответы (5)


Если вы не верите в MD5, вы можете попробовать более высокий алгоритм, используя хэш () функция:

$hash1 = hash('sha1', 'The string to hash by SHA-1');
$hash2 = hash('sha256', 'The string to hash by SHA-256');
$hash3 = hash('sha512', 'The string to hash by SHA-512');
$hash4 = hash('ripemd160', 'The string to hash by RIPEMD-160');

На мой взгляд, нет смысла хешировать дважды.

РЕДАКТИРОВАТЬ: исправлена ​​опечатка в последней строке кода.

person Community    schedule 27.12.2010
comment
Да не знал, что у PHP есть эти функции. Какой из них, по вашему мнению, был бы хорош, но не был бы лишним? - person NoviceCoding; 27.12.2010
comment
Я бы предпочел RIPEMD-160, потому что это открытый исходный код, и я думаю, что здесь не так много рисков безопасности, как в sha-1, но чем лучше алгоритм, тем он медленнее ... - person ; 27.12.2010
comment
@Novice, это не имеет значения. Все эти алгоритмы не лучше MD5. Только посол, ужесточение пароля и количество повторов могут вам помочь - person Your Common Sense; 27.12.2010
comment
sha256 значительно лучше, чем md5 (и sha1 в этом отношении). sha256 считается сильным алгоритмом. Независимо от того, какой алгоритм вы используете, вы должны включать случайную соль. - person Jacco; 27.12.2010
comment
@Marcel J. Kloubert, Все распространенные хэши имеют опубликованный источник. Разница в том, что RIPEMD-160 не ограничен никакими патентами; но он был менее изучен, чем, например, SHA256. - person Jacco; 27.12.2010
comment
@Jacco: Все алгоритмы SHA не имеют патентов и находятся в свободном доступе. - person President James K. Polk; 27.12.2010

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

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

person Jerry Coffin    schedule 27.12.2010
comment
охххх, в этом столько смысла, мужик, спасибо! Таким образом, соль - это, по сути, добавленная стоимость ко всему предварительному шифрованию паролей, что, следовательно, повышает безопасность паролей. - person NoviceCoding; 27.12.2010
comment
@NoviceCoding, для получения дополнительной информации о солении прочтите stackoverflow.com/questions/1645161/ - person Jacco; 27.12.2010

Независимо от того, используете ли вы алгоритм MD5 ...

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

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

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

person BoltClock    schedule 27.12.2010
comment
Да не думал об этом. Спасибо - person NoviceCoding; 27.12.2010
comment
Кроме того, вы можете использовать разные соли для каждого пароля. В противном случае, если я смогу определить, в чем заключается ваша соль, я могу сгенерировать радужную таблицу для всей вашей базы данных. Если вы используете разные соли, я могу создать радужную таблицу только для одного пароля (что бесполезно - я также могу его подобрать). - person Thanatos; 27.12.2010
comment
Итак, я понимаю, что лучший способ сделать это - создать случайный набор цифр (соль), добавить его к паролю, а затем хешировать. После хеширования сохраните пароль в базе данных с солью. Итак, мой вопрос: есть ли радужные таблицы для других методов хеширования, упомянутых Марселем? Так что мне лучше посолить MD5 или просто использовать RipeMD (наверное, проще было бы реализовать)? - person NoviceCoding; 27.12.2010
comment
@NoviceCoding: просто избегайте MD5 для хеширования паролей. - person BoltClock; 27.12.2010

Надежно хранить пароли сложно, большинство советов, опубликованных здесь, неточны. Так что я полагаюсь на широко цитируемую публикацию Томаса Птачека по этой теме: http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html

person ChrisRohlf    schedule 27.12.2010

Для протокола я оценил, что

$val = 'test';
$salt='somerandom!!aa##9900';
$val = md5($salt.$val);
$val = md5($val);

Это довольно безопасно. Секрет в соли.

Однако md5 короткий, поэтому шансы совпадения "высоки" (одно из 1.208.925.819.614.629.174.706.176 = 32 ^ 16, 32 слова с шестнадцатеричным числом каждое)

person magallanes    schedule 02.02.2016
comment
Соль нужно где-то хранить, потому что она нужна вам для проверки, а значит, это уже не секрет. Не следует использовать MD5, потому что это слишком быстро, вы можете вычислить больше, чем 100 Гигабайт MD5 в секунду. На той же странице вы можете увидеть, что производные, такие как двойной MD5, часто сразу же поддерживаются инструментами взломщика. - person martinstoeckli; 07.02.2016