Должен ли я использовать if(strcmp(md5($string),$hash)==0)
или if(md5($string)==$hash)
Каков наилучший способ сравнить хешированные строки? (PHP)
ответ
==
был показан другими пользователями здесь чрезвычайно ненадежны. Вместо этого вы должны использовать strcmp()
.
Третий вариант, если вы действительно хотите использовать оператор сравнения, является использование ===
, который не выполняет типа принуждение любого рода, и, следовательно, сохраняет типы и значения для целей сравнения.
Какой из них имеет лучшую производительность? – webnat0
==, потому что только одно сравнение, как мой пост ниже сказал –
@ Da9: ... и никакой вызов функции. –
Я думаю, что if(md5($string) == $hash)
лучше, потому что у вас есть только одно сравнение вместо 2 (stcmp & ==).
md5 генерирует только ascii-символы, которые не нуждаются в двоичном безопасном сравнении.
Обратите внимание на @MM. Во-вторых, md5 устарел (доказал, что его можно взломать). Используйте sha (лучше, не самый лучший). – Symba
Конечно, вы должны использовать sha over md5. Но вопроситель спросил, что он должен использовать. Если кто-то спросит вас: «Вы хотите клубничное мороженое или шоколадное мороженое?», Вы не можете ответить «Я принимаю ванильное мороженое». Кроме того, вопрос заключается не в использовании хеш-алгоритма, а в сравнении значений. –
Здесь мы не говорим о мороженое, но о безопасности. Поэтому ответ действительно «не используйте ничего из того, что вы предложили здесь!». И BTW: Также SHA-1 ** не должен ** использоваться для паролей. – rugk
Если вы сравниваете строки, используйте strcmp
или ===
. Люди предпочитают ===
, потому что strcmp
может ввести в заблуждение (он возвращает 0
по успеху, wat).
Вы должны использовать ===
, а не ==
. ==
преобразует оба операнда в целые числа, если они могут быть интерпретированы как таковые, и поскольку хеш MD5 не вписывается в целое число, они будут усечены вокруг половины. Поэтому только первые половины хэшей должны быть равны. См. http://phpsadness.com/sad/47.
Если вы используете хеширующие пароли, подумайте об использовании медленного и сильного алгоритма хеширования, такого как PBKDF2, а не MD5.
Ничего себе ... это действительно грустно. – BoltClock
Вы должны быть очень осторожны при сравнении хешей непосредственно для таких вещей, как аутентификация, поскольку вы можете открыть окно для временной атаки.
Хотя это звучит очень противоречиво, вы должны полностью сравнить строку, избегая любых оптимизаций (то есть, выходите рано, если символ отличается).
Вот некоторые ссылки о проблеме:
- https://wiki.php.net/rfc/timing_attack
- http://codahale.com/a-lesson-in-timing-attacks/
- http://carlos.bueno.org/2011/10/timing.html
А вот некоторые идеи для того, чтобы исправить это:
- Самый быстрый и простой: используйте
hash_equals()
, если доступно (PHP 5.6 и выше). - https://github.com/symfony/polyfill-php56/blob/master/Php56.php (
hash_equals()
polyfill) - https://github.com/zendframework/zend-crypt/blob/master/src/Utils.php (
compareStrings()
)
Если вы используете что-то более новое, чем PHP 5.6 (и в том числе), вы должны использовать timing attack safe string comparison функцию.
if (hash_equals($expected, $correct)) {
}
(Если вы на PHP 5.5 или выше, see here for equivalents.)
Единственный правильный ответ. –
На самом деле вы должны использовать password_verify
для этого, а также использовать все другие password_*
функции. Они доступны в PHP> = 5.5.0.
В качестве резерва вы можете использовать this polyfill. В настоящее время он работает с PHP> = 5.3.7.
И если вы действительно не можете/не хотите использовать это, все равно hash_equals
(и полиполняет для этого) как @MM. уже сказал.
- 1. Каков наилучший способ сравнить сходство двух строк?
- 2. Каков наилучший способ сравнить равенство файлов?
- 3. Каков наилучший способ сравнить Double и Int?
- 4. Каков наилучший способ сравнить два листа Excel?
- 5. Каков наилучший способ сравнить несколько свойств javabean?
- 6. Каков наилучший способ сравнить 2 вектора или строки по элементам?
- 7. Каков наилучший способ сравнить две строки для равенства в C?
- 8. Каков наилучший или быстрый способ сравнить две строки?
- 9. Каков наилучший способ проверки строки?
- 10. Каков наилучший способ шифрования/дешифрования строки json
- 11. Каков наилучший способ разбора строки друзей Facebook?
- 12. Каков наилучший способ сравнить строку с другой строкой?
- 13. Каков наилучший способ сравнить 2 дерева папок на окнах?
- 14. Каков наилучший способ форматирования строки в Scala?
- 15. Каков наилучший способ разделения строки подключения ldap?
- 16. Каков наилучший способ удаления фрагментов строки? (C#)
- 17. Каков наилучший способ поиска строки в файле?
- 18. Каков наилучший способ удаления строки в CursorAdapter?
- 19. Каков наилучший способ преобразования строки в float?
- 20. Каков наилучший способ tokenize строки в C++?
- 21. Каков наилучший способ жесткого кодирования многострочной строки?
- 22. Каков наилучший способ редактировать похожие строки?
- 23. Каков наилучший способ desirialize этой строки json?
- 24. Каков наилучший способ перебора строк строки Java?
- 25. Каков наилучший способ удалить HTML из строки?
- 26. Каков наилучший способ анализа интервала из строки?
- 27. Каков наилучший способ регистрации Исключения для строки
- 28. Каков наилучший способ создания случайного хэша/строки?
- 29. Каков самый быстрый способ сравнить начало строки?
- 30. Каков наилучший способ создания функции валидатора? PHP
Используйте 'strcmp' в пользовательских настройках сортировки. Для «нормального» использования сравнение строк напрямую проще и легче читать. –
Для всех, кто читает эту тему, [вы, вероятно, не должны этого делать ** вообще **] (http://phpsadness.com/sad/47). – ereOn
Если вы хотите просто сравнить хэши надежно, просто используйте '==='. Если вы действительно заботитесь о безопасности и потенциальных атак времени (даже несмотря на дрожание сети), вы должны взглянуть на [это] (https://github.com/delight-im/Faceless/issues/4) или [это] (https://github.com/delight-im/Faceless/pull/5) или используйте функцию 'hash_equals()' (PHP 5.6+). – caw