В моей первой статье о PHP хэше Алгоритмы Я изучил текущее состояние алгоритмов и то, как они работают в гонке друг с другом. В этом посте я хочу немного глубже погрузиться в результаты, полученные с помощью обновленной версии моего кода.
Как и в случае с первой версией результатов, код и сгенерированный csv-файл можно найти в репозитории .
Обновленные результаты для всех алгоритмов хеширования
Как объяснялось в первом посте, я хотел сгенерировать больше результатов на основе различных длин строк, переданных в функцию hash() . Помимо обычной генерации хэшей для интерфейса командной строки, я добавил еще один файл, содержащий код для создания сложного файла .csv. Этот файл содержит время, необходимое каждому алгоритму для генерации строк длиной 512 до длины 33554432 , что равно 2^25 . Хэш генерируется для длин строк с шагом последней длины, умноженным на два, поэтому 512 , 1024 , 2048 и так далее.
Но это еще не все. Для каждой длины строки вычисляется наиболее эффективный алгоритм и добавляется к результатам.
Длина строки имеет значение для генерации хэша
То, что кажется очевидным, действительно является интересным фактором, который следует учитывать при генерации хэшей. Поскольку все эти алгоритмы являются своего рода математическими конструкциями, каждый алгоритм может работать намного лучше или намного хуже другого. Поскольку все эти алгоритмы являются своего рода математическими конструкциями, каждый алгоритм может работать намного лучше или намного хуже другого. Я взял 5 разных длин строк из всех сгенерированных, чтобы получить простой обзор алгоритмов выполнения и того, как они ведут себя, если длина строки изменяется экспоненциально.
Самые медленные алгоритмы
| 0,0751019 мс | гост (сырье) | 2^9 | снефру (0,0660419 мс) |
| 0,8158684 мс | md2 (необработанный) | 2^13 | sha3-512 (0,4711151 мс) |
| 13.1139755 мс | md2 (необработанный) | 2^17 | sha3-512 (7,2920322 мс) |
| 204,2510509 мс | md2 (необработанный) | 2^21 | sha3-512 (113.0850315 мс) |
| 3277.1139145 мс | md2 (необработанный) | 2^25 | sha3-512 (1859.3208790 мс) |
Как вы можете видеть, MD2 является самым медленным алгоритмом, за исключением самой короткой длины строки. За ним следует SHA3-513, но с большим промежутком между ними. Для самой длинной строки длиной 2 ^ 25 MD2 занимает почти вдвое больше времени для генерации хэша, чем SHA3-512.
Самые быстрые алгоритмы
| 0,0088215 мс | adler32 (необработанный) | 2^13 | fnv164 (0,0119209 мс) |
| 0,0741482 мс | adler32 (необработанный) | 2^17 | md4 (0,1289845 мс) |
| 1,9049644 мс | adler32 (шестнадцатеричный) | 2^21 | md4 (1,9161701 мс) |
| 17.7400112 мс | adler32 (необработанный) | 2^25 | md4 (30.8220387 мс) |
В случае самого быстрого алгоритма Adler32 участвовал в гонке. Пожалуйста, обратите внимание, что я пропустил генерацию для строки длиной 512 , потому что нескольким алгоритмам потребовалось 0,0050068 мс для завершения, поэтому явный победитель не может быть выбран. MD4 вышел на второе место.
Исследование самых быстрых алгоритмов
Давайте взглянем на оба алгоритма, потому что скорость, особенно Adler-32, поразительна. Согласно таким источникам, как RFC 3309 , в котором описывается изменение контрольной суммы с Adler-32 на CRC32 для протокола SCTP, Adler-32 является слабым, если используется либо для коротких сообщений, либо когда исходная строка не сильно меняется. MD4, с другой стороны, уже известен как небезопасный, как вы можете прочитать в разделе “Безопасность” на странице Википедии. Несколько тестов успешно завершили столкновение, что является худшим, что может случиться с алгоритмом.
Просто чтобы убедиться, давайте еще раз взглянем на наши данные и выберем следующий самый быстрый алгоритм: FNV в разных вариациях. Согласно нашим данным, fnv1a64 занял третье место со временем выполнения 34,1711044 мс для длины 2^25 . Разрыв между MD4 и FNV незначителен всего 4 мс .
Несколько слов о безопасности
Хэши предназначены для преобразования входной строки в выходную строку фиксированной длины. Что касается безопасности, мы можем разделить алгоритмы хеширования на две группы: криптографические и некриптографические алгоритмы. Первые используются, например, для генерации хэшей паролей с помощью функции password_hash() и могут считаться безопасными. Последние, напротив, используются для хранения информации более плотным способом или проверки соответствия большого заданного значения другому путем вычисления и сравнения их хэшей.
Если вы новичок в мире программирования и хотите начать с хранения своих первых паролей пользователей в базе данных, то никогда используйте что-то вроде хэша('md5', $user_password) !!! Единственный правильный способ правильно сгенерировать безопасный и надежный хэш пароля пользователя – это использовать функцию, упомянутую выше:
// PHP < 7.2 $hash = password_hash($user_password, PASSWORD_BCRYPT); // or for PHP starting at 7.2 $hash = password_hash($user_password, PASSWORD_ARGON2I);
Чтобы иметь возможность проверить полученный хэш, когда пользователь захочет снова войти в систему, используйте для этого соответствующую функцию:
$password_matches = password_verify($user_password, $hash);
Эта статья была впервые опубликована на Эта статья была впервые опубликована на
Оригинал: “https://dev.to/kovah/a-deeper-look-into-php-hash-algorithms-1jhe”