В PHP есть несколько способов хеширования данных.
md5
Это один из самых старых и широко используемых методов хеширования. Он создает 128-битный хеш в виде 32-символьной шестнадцатеричной строки.
md5 был одним из первых широко используемых алгоритмов хеширования, но на сегодняшний день он считается устаревшим и небезопасным для большинства криптографических приложений, особенно для хеширования паролей. Это связано с тем, что были обнаружены уязвимости, позволяющие проводить коллизионные атаки (когда два разных ввода дают одинаковый хеш).
$hash = md5( 'Мой человек меня понимает' ); $hash = md5( 'Мой человек меня понимает', false ); // второй параметр по умолчанию установлен в false # Возвращает необработанный двоичный хеш $hash = md5( 'Мой человек меня понимает', true);
sha1
Этот метод создает 160-битный хеш в виде 40-символьной шестнадцатеричной строки. Он считается более безопасным, чем MD5.
sha1 является более безопасным, чем MD5, но он также считается устаревшим для многих криптографических приложений из-за возможности коллизионных атак. Google в 2017 году продемонстрировал успешную коллизионную атаку на sha1.
$hash = sha1( 'Мой человек меня понимает' ); // Возвращает необработанный двоичный хеш $hash = sha1( 'Мой человек меня понимает', true );
hash()
Эта функция PHP позволяет использовать различные алгоритмы хеширования, такие как sha256, sha512, ripemd160, whirlpool и другие.
Алгоритмы хеширования sha256 и sha512считаются достаточно безопасными для большинства приложений на текущий момент.
$hash = hash( 'sha256', 'Мой человек меня понимает' ); $hash = hash( 'sha512', 'Мой человек меня понимает' ); $hash = hash( 'md5', 'Мой человек меня понимает' ); $hash = hash( 'crc32', 'Мой человек меня понимает' ); # Возвращает необработанный двоичный хеш $hash = hash( 'sha256', 'Мой человек меня понимает', true ); # Список поддерживаемых алгоритмов хеширования print_r( hash_algos() );
password_hash() и password_verify()
Эти функции PHP предназначены специально для хеширования паролей.
Эти функции представляют собой современный и рекомендуемый подход к хешированию паролей в PHP. Они используют сильные алгоритмы хеширования (BCrypt, Argon2), автоматически добавляют соль к хешу и поддерживают "cost factor", который делает атаку перебором непрактичной. Это на данный момент самый безопасный вариант для хеширования паролей в PHP.
# PASSWORD_DEFAULT - используется алгоритм bcrypt
# PASSWORD_BCRYPT - использует алгоритм CRYPT_BLOWFISH
# PASSWORD_ARGON2I - использует алгоритм Argon2i
# PASSWORD_ARGON2ID - использует алгоритм Argon2id
$hash = password_hash( 'mypassword', PASSWORD_DEFAULT );
# password_hash() возвращает алгоритм, стоимость и соль как части хеша.
# Таким образом, вся необходимая для проверки информация включена в него
if( password_verify( 'mypassword', $hash ) )
{
echo 'Пароль верный.';
}
else
{
echo 'Неверный пароль.';
}
crypt()
Это функция, которая может использовать различные алгоритмы хеширования в зависимости от указанного префикса. Она может использовать алгоритмы, такие как Standard DES, Extended DES, Blowfish, MD5 и другие. Однако на сегодняшний день рекомендуется использовать функцию password_hash() для хеширования паролей, так как она обеспечивает большую безопасность и легкость использования.
# Алгоритм хеширования в функции crypt() в PHP задается через второй параметр, который является солью # https://www.php.net/manual/ru/function.crypt.php $hash = crypt( 'mypassword', 'salt' ); # Пример вычисления хеша с использованием алгоритма CRYPT_SHA256 для пароля password123 # Генерируем соль $salt = substr( str_replace( '+', '.', base64_encode( random_bytes(16) ) ), 0, 16 ); # Создаем строку соли с указанием количества раундов и алгоритма $full_salt = sprintf( '$5$rounds=5000$%s$', $salt ); # Хешируем пароль $hashed_password = crypt( 'password123', $full_salt ); echo $hashed_password;
hash_hmac()
Эта функция генерирует хеш-значение с использованием алгоритма HMAC (Hash-based Message Authentication Code). HMAC используется для проверки целостности и подлинности сообщения с секретным ключом.
$hash = hash_hmac( 'sha256', 'Мой человек меня понимает', 'secret' ); # Возвращает необработанный двоичный хеш $hash = hash_hmac( 'sha256', 'Мой человек меня понимает', 'secret', true ); # Список поддерживаемых алгоритмов хеширования print_r( hash_hmac_algos() );
hash_pbkdf2()
Эта функция генерирует производный ключ из указанного пароля и соли, используя алгоритм PBKDF2 (Password-Based Key Derivation Function 2 - Функция получения ключа на основе пароля 2). PBKDF2 используется в криптографии для генерации и усиления ключей.
# 1000 - это количество итераций, которое будет выполнено. Большее количество итераций делает процесс хеширования медленнее, что может помочь защитить пароли от атак перебором. # 20 - это длина выводимого хеша в байтах. Если этот параметр равен 0, то выводимый хеш будет иметь максимальную длину для выбранного алгоритма хеширования (в данном случае, 64 символа для SHA-256) $hash = hash_pbkdf2( 'sha256', 'password', 'salt', 1000, 20 ); # Возвращает необработанный двоичный хеш $hash = hash_pbkdf2( 'sha256', 'password', 'salt', 1000, 20, true ); # Список поддерживаемых алгоритмов хеширования print_r( hash_algos() );
openssl_digest() и openssl_encrypt()
Эти функции предоставляют набор криптографических операций, включая хеширование и шифрование, и поддерживают множество алгоритмов.
$hash = openssl_digest( 'Мой человек меня понимает', 'sha512' ); # Возвращает необработанный двоичный хеш $hash = openssl_digest( 'Мой человек меня понимает', 'sha512', true ); # список доступных методов хеширования print_r( openssl_get_md_methods() );
Хеширование данных в PHP и других языках программирования используется по нескольким причинам:
Безопасность паролей:
Хеширование паролей является стандартной практикой безопасности. Когда пользователь вводит пароль, он хешируется, и хеш сохраняется в базе данных. Когда пользователь входит в систему, введенный пароль снова хешируется и сравнивается с сохраненным хешем. Это означает, что даже если база данных будет скомпрометирована, злоумышленник не сможет узнать исходные пароли пользователей.Проверка целостности данных:
Хеширование можно использовать для проверки того, что данные не были изменены в процессе передачи. Например, при загрузке файла можно сравнить его хеш с предоставленным хешем, чтобы убедиться, что файл не был поврежден или изменен.Ускорение поиска данных:
Хеширование может быть использовано для ускорения поиска данных в больших наборах данных. Это особенно полезно в структурах данных, таких как хеш-таблицы.Уникальные идентификаторы:
Хеш-функции могут генерировать уникальные идентификаторы для данных. Это может быть полезно, например, для создания цифровых отпечатков файлов или для генерации уникальных ключей в базе данных.Криптография:
Хеширование является важной частью многих криптографических алгоритмов и протоколов, включая цифровые подписи, функции проверки целостности сообщений (HMAC) и другие.
Комментарии
0Нашли ошибку или хотите дополнить материал?