Что такое хэш пароля

Обновлено: 03.07.2024

password_hash() создает новый хэш пароля, используя надежный алгоритм одностороннего хеширования.

В настоящее время поддерживаются следующие алгоритмы:

  • PASSWORD_DEFAULT — использовать алгоритм bcrypt (по умолчанию в PHP 5.5.0). Обратите внимание, что эта константа предназначена для изменения со временем, когда в PHP добавляются новые и более сильные алгоритмы. По этой причине длина результата использования этого идентификатора может меняться со временем. Поэтому рекомендуется хранить результат в столбце базы данных, длина которого может превышать 60 символов (хорошим выбором будет 255 символов).
  • PASSWORD_BCRYPT — используйте алгоритм CRYPT_BLOWFISH для создания хэша. Это создаст стандартный хэш, совместимый с crypt(), с использованием идентификатора «$2y$». Результатом всегда будет строка из 60 символов или false в случае ошибки.
  • PASSWORD_ARGON2I — используйте алгоритм хеширования Argon2i для создания хэша. Этот алгоритм доступен только в том случае, если PHP был скомпилирован с поддержкой Argon2.
  • PASSWORD_ARGON2ID — используйте алгоритм хэширования Argon2id для создания хэша. Этот алгоритм доступен только в том случае, если PHP был скомпилирован с поддержкой Argon2.

Поддерживаемые параметры для PASSWORD_BCRYPT:

salt ( string ) — вручную указать соль для использования при хешировании пароля. Обратите внимание, что это переопределит и предотвратит автоматическое создание соли.

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

Опция соли устарела. Теперь предпочтительнее просто использовать соль, которая генерируется по умолчанию. Начиная с PHP 8.0.0 явно указанная соль игнорируется.

cost ( int ) — обозначает стоимость алгоритма, которую следует использовать. Примеры этих значений можно найти на странице crypt().

Если опущено, будет использоваться значение по умолчанию 10. Это хорошая базовая стоимость, но вы можете увеличить ее в зависимости от вашего оборудования.

Поддерживаемые параметры для PASSWORD_ARGON2I и PASSWORD_ARGON2ID:

memory_cost ( int ) — максимальная память (в кибибайтах), которую можно использовать для вычисления хэша Argon2. По умолчанию PASSWORD_ARGON2_DEFAULT_MEMORY_COST .

time_cost ( int ) — максимальное количество времени, которое может потребоваться для вычисления хэша Argon2. По умолчанию PASSWORD_ARGON2_DEFAULT_TIME_COST .

threads ( int ) — количество потоков, используемых для вычисления хэша Argon2. По умолчанию PASSWORD_ARGON2_DEFAULT_THREADS .

Доступно, только если PHP использует libargon2, но не с реализацией libsodium.

Параметры

Пароль пользователя.

Использование PASSWORD_BCRYPT в качестве алгоритма приведет к усечению параметра пароля до максимальной длины 72 байта.

Константа алгоритма пароля, обозначающая алгоритм, используемый при хешировании пароля.

Ассоциативный массив, содержащий параметры. Документацию по поддерживаемым параметрам для каждого алгоритма см. в константах алгоритма пароля.

Если этот параметр не указан, будет создана случайная соль и будет использоваться стоимость по умолчанию.

Возвращаемые значения

Возвращает хешированный пароль.

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

Журнал изменений

< td>password_hash() больше не возвращает false при ошибке.
Версия Описание
8.0.0
8.0.0 Параметр algo теперь может принимать значение NULL.
7.4.0 Параметр algo теперь ожидает строку, но по-прежнему принимает int для обратной совместимости.
7.4. 0 Расширение натрия обеспечивает альтернативную реализацию паролей Argon2.
7.3.0 Поддержка паролей Argon2id с использованием PASSWORD_ARGON2ID была добавлено.
7.2.0 Добавлена ​​поддержка паролей Argon2i с использованием PASSWORD_ARGON2I.

Примеры

/**
* Мы просто хотим хэшировать наш пароль, используя текущий алгоритм DEFAULT.
* В настоящее время это BCRYPT, результат будет состоять из 60 символов.
*
* Имейте в виду, что DEFAULT может измениться со временем, поэтому вы должны подготовиться,
* Разрешив расширение хранилища за пределы 60 символов (255 было бы хорошо)
*/
echo password_hash ("rasmuslerdorf", PASSWORD_DEFAULT);
?>

Приведенный выше пример выведет что-то похожее на:

/**
* В этом случае мы хотим увеличить стоимость по умолчанию для BCRYPT до 12.
* Обратите внимание, что мы также переключились на BCRYPT, который всегда будет состоять из 60 символов.
*/
$options = [
'cost' => 12 ,
];
echo password_hash ("rasmuslerdorf", PASSWORD_BCRYPT, $options);
?>

Приведенный выше пример выведет что-то похожее на:

$cost = 8 ;
делать $cost ++;
$start = микровремя ( true );
password_hash ("test" , PASSWORD_BCRYPT , [ "cost" => $cost ]);
$end = microtime ( true );
> while (( $end - $start ) $timeTarget );

echo "Найдена подходящая стоимость: " . $стоимость;
?>

Приведенный выше пример выведет что-то похожее на:

Приведенный выше пример выведет что-то похожее на:

Примечания

Настоятельно рекомендуется не создавать собственную соль для этой функции. Он автоматически создаст безопасную соль, если вы ее не укажете.

Как отмечалось выше, при использовании параметра соли в PHP 7.0 будет выдано предупреждение об устаревании. Поддержка предоставления соли вручную может быть удалена в будущем выпуске PHP.

Примечание:

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

  • Любой новый алгоритм должен находиться в ядре как минимум 1 полной версии PHP, прежде чем он станет стандартным. Таким образом, если, например, в версии 7.5.5 будет добавлен новый алгоритм, он не будет иметь права на использование по умолчанию до версии 7.7 (поскольку 7.6 будет первым полным выпуском). Но если в версии 7.6.0 будет добавлен другой алгоритм, он также будет иметь право на использование по умолчанию в версии 7.7.0.
  • Значение по умолчанию должно меняться только в полной версии (7.3.0, 8.0.0 и т. д.), но не в исправлении. Единственным исключением из этого правила является экстренная ситуация, когда в текущем заданном по умолчанию обнаружена серьезная уязвимость в системе безопасности.

См. также

  • password_verify() — проверяет, соответствует ли пароль хешу.
  • crypt() — одностороннее хеширование строк
  • sodium_crypto_pwhash_str() — получить хэш в кодировке ASCII

Примечания, внесенные пользователями 12 примечаний

С 2017 года NIST рекомендует использовать секретный ввод при хешировании запомненных секретов, таких как пароли. Подмешивая секретный ввод (обычно называемый «перцем»), злоумышленник не может полностью подобрать хэши паролей, даже если у них есть хэш и соль. Например, SQL-инъекция обычно влияет только на базу данных, а не на файлы на диске, поэтому перец, хранящийся в файле конфигурации, все равно будет недоступен для злоумышленника. Перец должен быть сгенерирован случайным образом один раз и может быть одинаковым для всех пользователей. Многие утечки паролей могли бы стать совершенно бесполезными, если бы этим занимались владельцы сайтов.

// register.php
$pepper = getConfigVariable("pepper");
$pwd = $_POST ['пароль'];
$pwd_peppered = hash_hmac("sha256", $pwd, $pepper);
$pwd_hashed = пароль_хэш ( $pwd_peppered , PASSWORD_ARGON2ID );
add_user_to_database ( $username , $pwd_hashed );
?>

// login.php
$pepper = getConfigVariable ("перец");
$pwd = $_POST ['пароль'];
$pwd_peppered = hash_hmac("sha256", $pwd, $pepper);
$pwd_hashed = get_pwd_from_db ( $username );
if ( password_verify ( $pwd_peppered , $pwd_hashed )) echo "Пароль совпадает." ;
>
else echo "Неверный пароль." ;
>
?>

Обратите внимание, что этот код содержит атаку по времени, которая позволяет узнать, существует ли имя пользователя. Но моя заметка превышала ограничение по длине, поэтому мне пришлось вырезать этот абзац.

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

Почему это работает? Потому что после кражи базы данных злоумышленник делает следующее:

password_verify("a", $stolen_hash)
password_verify("b", $stolen_hash)
.
password_verify("z", $stolen_hash)
password_verify("aa", $stolen_hash)
и т. д.

(Более реалистично, они используют словарь для взлома, но в принципе способ взломать хэш пароля — это угадать. Поэтому мы используем специальные алгоритмы: они медленнее, поэтому каждая операция verify() будет медленнее, поэтому они могут перебирать гораздо меньше паролей за час взлома.)

Что, если бы вы использовали этот перец? Теперь им нужно сделать следующее:

password_verify(hmac_sha256("a", $secret), $stolen_hash)

Без этого $secret (перца) они не смогут выполнить это вычисление. Они должны были бы сделать:

проверка_пароля(hmac_sha256("а", "а"), $stolen_hash)
проверка_пароля(hmac_sha256("а", "б"), $stolen_hash)
.
и т. д., пока они не найдут правильный перец.

Если ваш перец содержит 128 бит энтропии и пока hmac-sha256 остается безопасным (даже MD5 технически безопасен для использования в hmac: нарушена только его устойчивость к коллизиям, но, конечно, никто не будет использовать MD5, потому что все больше и больше обнаружены недостатки), на это ушло бы больше энергии, чем вырабатывает солнце. Другими словами, в настоящее время невозможно расколоть такой крепкий перец, даже зная пароль и соль.

От открытого текста к хешированному, соленому , приправленный и зашифрованный, защита паролем полна жаргона». ширина =

От Yahoo, MySpace и TalkTalk до Ashley Madison и Adult Friend Finder хакеры со всего мира украли личную информацию.

Но с каждым взломом возникает большой вопрос, насколько хорошо сайт защитил данные своих пользователей. Был ли он открытым и свободно доступным, или же он был хеширован, защищен и практически не поддается взлому?

От открытого текста до хеширования, соленого, перченого и зашифрованного — вот что на самом деле означает непроницаемый жаргон защиты паролей.

Терминология

Обычный текст

Когда что-то описывается как хранящийся как «открытый текст» или как «обычный текст», это означает, что эта вещь находится в открытом виде в виде простого текста — без какой-либо безопасности, кроме простого контроля доступа к базе данных, которая его содержит.

Если у вас есть доступ к базе данных, содержащей пароли, вы можете прочитать их точно так же, как вы можете прочитать текст на этой странице.

Хеширование

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

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

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

Соление

Пароли часто называют "хешированными и солеными". Соление — это просто добавление уникальной случайной строки символов, известной только сайту, к каждому паролю перед его хэшированием. Обычно эта «соль» помещается перед каждым паролем.

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

Использование уникальных солей означает, что общие пароли, совместно используемые несколькими пользователями, такие как «123456» или «пароль», не раскрываются сразу после идентификации одного такого хешированного пароля, потому что, несмотря на то, что пароли одинаковы, хешированные значения — нет.

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

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

Приправление

Криптографы любят свои приправы. «Перец» похож на соль — значение, добавляемое к паролю перед хэшированием, — но обычно помещаемое в конце пароля.

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

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

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

Шифрование

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

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

Зашифрованные пароли обычно используются для проверки второго фактора, а не в качестве основного фактора входа в систему.

Шестнадцатеричный

Шестнадцатеричное число, также известное как «шестнадцатеричное» или «основание 16», представляет собой способ представления значений от нуля до 15 с помощью 16 отдельных символов. Числа от 0 до 9 представляют значения от нуля до девяти, а a, b, c, d, e и f — от 10 до 15.

Они широко используются в вычислениях как удобный для человека способ представления двоичных чисел. Каждая шестнадцатеричная цифра представляет собой четыре бита или половину байта.

Алгоритмы

MD5

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

ША-1

Secure Hash Algorithm 1 (SHA-1) — это криптографический алгоритм хэширования, разработанный Агентством национальной безопасности США в 1993 году и опубликованный в 1995 году.

Он генерирует 160-битное хэш-значение, которое обычно отображается как 40-значное шестнадцатеричное число. По состоянию на 2005 год SHA-1 больше не считался безопасным, поскольку экспоненциальный рост вычислительной мощности и изощренных методов означал, что можно было выполнить так называемую атаку на хэш и создать исходный пароль или текст, не тратя миллионы на вычисления. ресурсы и время.

ША-2

Алгоритм безопасного хэширования 2 (SHA-2), преемник SHA-1, представляет собой семейство хэш-функций, которые производят более длинные хэш-значения с 224, 256, 384 или 512 битами, записанными как SHA-224, SHA-256, SHA-384 или SHA-512.

Впервые он был опубликован в 2001 году, снова разработан АНБ, и эффективная атака против него еще не продемонстрирована. Это означает, что SHA-2 обычно рекомендуется для безопасного хеширования.

SHA-3, хотя и не является заменой SHA-2, был разработан не АНБ, а Гвидо Бертони, Джоан Демен, Микаэлем Петерсом и Жилем Ван Аше из STMicroelectronics и Университета Радбауд в Неймегене, Нидерланды. Он был стандартизирован в 2015 году.

Bcrypt

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

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

При увеличении коэффициента работы перебор пароля и сопоставление хэша занимает больше времени. Теория состоит в том, что владелец сайта устанавливает достаточно высокий коэффициент работы, чтобы уменьшить количество догадок, которые современные компьютеры могут сделать для пароля, и увеличить время с дней или недель до месяцев или лет, что делает его непомерно трудоемким и дорогим.< /p>

PBKDF2

Функция формирования ключа на основе пароля 2 (PBKDF2), разработанная RSA Laboratories, представляет собой еще один алгоритм расширения ключа, который затрудняет подбор хэшей методом грубой силы. Считается, что использовать грубую силу с определенным значением несколько проще, чем Bcrypt, поскольку для запуска алгоритма требуется меньше компьютерной памяти.

Скрипт

Scrypt, как и Bcrypt и PBKDF2, представляет собой алгоритм, расширяющий ключи и усложняющий атаку методом грубой силы на хэш. Однако, в отличие от PBKDF2, scrypt предназначен либо для использования большого объема компьютерной памяти, либо для выполнения большего количества вычислений во время работы.

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

А как же пароли?

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

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

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

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

Чтобы повторно просмотреть эту статью, перейдите в раздел "Мой профиль" и выберите "Просмотреть сохраненные истории".

Это изображение может содержать Торговая марка «Символ первой помощи» «На открытом воздухе» и «Символ звезды» /><br /></p>
<p>Чтобы повторно просмотреть эту статью, перейдите в раздел

Цифровые мегавзломы в последнее время стали настолько обычным явлением, что их почти невозможно различить по шкале тревоги: сегодня из одной социальной сети украдено сто миллионов паролей, а на следующий день — еще несколько сотен миллионов. Все это превращается в удручающее пятно. Но не все катастрофы с паролями одинаково губительны. А разница между Три-Майл-Айлендом и Хиросимой иногда сводится к загадочной области криптографии: хешированию.

TL;DR Хэш — это и существительное, и глагол. Хэширование — это преобразование паролей в нечитаемые строки символов, которые невозможно преобразовать обратно, известные как хэши. Некоторые схемы хеширования легче взломать, чем другие.

Когда хакеры взламывают компанию, чтобы получить доступ к ее коллекции паролей пользователей, то, что они находят и крадут, не сохраняется в форме, понятной для людей, по крайней мере, если у компании есть хоть какое-то представление о безопасности. Вместо этого кеш паролей часто преобразуется в набор криптографических хэшей, случайно выглядящих строк символов, в которые пароли были математически преобразованы, чтобы предотвратить их неправильное использование. Это преобразование называется хэшированием. Но именно то, какой вид хэширования подвергся этим паролям, может означать разницу между ворами, получающими зашифрованный текст, на расшифровку которого уходят годы, или успешным «взломом» этих хэшей за дни или часы, чтобы преобразовать их обратно в пригодные для использования пароли, готовые получить доступ к вашему конфиденциальные аккаунты.

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

"Хеш обычно принимает входные данные, что-то с ними делает, а то, что получается, выглядит как случайные данные", – говорит Йенс "Атом" Штойбе, создатель популярной программы для взлома хэшей Hashcat. "Когда вы снова вводите одни и те же данные, выходящие данные будут точно такими же. Именно так служба узнает, что ввод был правильным".

Теоретически никто, ни хакер, ни даже сам веб-сервис, не должен иметь возможности получить эти хэши и преобразовать их обратно в пароли. Но на практике некоторые схемы хеширования значительно труднее отменить, чем другие. Коллекция из 177 миллионов учетных записей LinkedIn, украденных в 2012 году, которые были выставлены на продажу на рынке даркнета на прошлой неделе, например, фактически была хеширована. Но компания использовала только простую функцию хеширования под названием SHA1 без дополнительной защиты, что позволило легко взломать почти все хешированные пароли. В результате хакеры смогли не только получить доступ к паролям, но и попробовать их на других веб-сайтах, что, вероятно, привело к тому, что в минувшие выходные аккаунты Марка Цукерберга в Twitter и Pinterest были взломаны.

Напротив, взлом на краудфандинговом сайте Patreon в прошлом году выявил пароли, которые были хешированы с помощью гораздо более надежной функции под названием bcrypt, что, вероятно, обеспечило относительную безопасность всего кеша, несмотря на взлом. Об этом сообщил Рик Редман, специалист по тестированию на проникновение в фирме KoreLogic, который проводит соревнование по взлому паролей на ежегодной хакерской конференции Defcon. «Надежность хэша — это страховой полис. Он говорит вам, сколько времени у пользователей есть, чтобы изменить свои пароли после утечки данных, прежде чем они пострадают», — говорит Редман. "Если это просто SHA1, то окна нет. Если это bcrypt, у вас есть время убежать и сменить все свои пароли."

Чтобы увидеть разницу между этими схемами хеширования, рассмотрим, как работает взлом паролей: хакеры не могут отменить хешированный пароль, созданный с помощью такой функции, как SHA1. Но они могут просто попытаться угадать пароли и запустить их через ту же функцию. Когда они находят соответствующий хэш, они знают, что набрали правильный пароль. Программа взлома хэшей, работающая с большой базой данных хэшей, может подобрать миллионы или миллиарды возможных паролей и автоматически сравнить результаты с полной коллекцией украденных хешированных паролей, чтобы найти совпадения.


Если вы, как и я, часто пользуетесь Интернетом, скорее всего, вы получили электронное письмо примерно такого содержания:

Недавно наш веб-сайт стал жертвой кибератаки на нашу корпоративную сеть. Все пароли были зашифрованы, но в качестве меры предосторожности мы требуем, чтобы все наши клиенты немедленно сбрасывали свои пароли.

Спасибо.

Итак, произошла утечка части вашей информации, включая ваш зашифрованный пароль. Ваш аккаунт в опасности?

Короткий ответ: ДА, но почему?

Чтобы понять это, вы должны понимать концепцию «хеширования паролей».

Что такое хэш?

Хэш — это просто способ представления любых данных в виде уникальной строки символов. Вы можете хешировать что угодно: музыку, фильмы, свое имя или эту статью. Образно говоря, хеширование — это способ присвоения «имени» вашим данным. Это позволяет вам взять ввод любой длины и превратить его в строку символов, которая всегда имеет одинаковую длину. Очевидно, что для этого существует множество методов (алгоритмов).

Несколько самых популярных алгоритмов хеширования:

  • MD5 — для любых данных будет возвращен уникальный 32-символьный хэш.
  • SHA1 — для любых данных будет возвращен уникальный 40-символьный хэш.
  • SHA256. Любые данные будут возвращать уникальный 64-символьный хеш; разработан Агентством национальной безопасности.

Давайте рассмотрим простой пример:

Меня зовут Джамин Беккер

Хеш-представление моего имени в формате MD5:

hashing-diagram-illustration1

Хэш-представление моего имени SHA1:

Хэш-представление моего имени SHA256:

Почему хэширование безопасно?

Причина, по которой хеширование является безопасным, проста: хеширование — это односторонняя операция. Они не могут быть обращены вспять. Имея строку «eeb7048c69b088739908f5f5144cd1f5», невозможно изменить хэш MD5, чтобы вернуть «Джамин Беккер». Это связано с тем, как математики и программисты структурировали алгоритм хеширования MD5, и он восходит к фундаментальной проблеме информатики под названием «P vs NP». P и NP — это всего лишь два класса алгоритмов.

Большинство алгоритмов хеширования подпадают под категорию NP, что означает, что их можно быстро вычислить. Однако алгоритмы дехеширования (например, «eeb7048c69b088739908f5f5144cd1f5» -> «Jamin Becker») относятся к классу P и могут быть эффективно решены только за полиномиальное время (т. е. с использованием квантового компьютера, значительно более совершенного, чем те, которые доступны сегодня).< /p>

Почему это хорошо для безопасности?

hashing-diagram-illustration2

Скажем, вы подписываетесь на веб-сайт и выбираете пароль «12345». Сразу же этот веб-сайт хэширует ваш пароль, возможно, с помощью SHA1, и сохраняет его в базе данных. Теперь каждый раз, когда вы входите в систему, веб-сайт будет перефразировать ваш пароль и сравнивать его с тем, который хранится в базе данных. Если они совпадают, вы будете успешно аутентифицированы. Если веб-сайт когда-либо будет взломан и произойдет утечка базы данных паролей, ваш пароль будет отображаться как «8cb2237d0679ca88db6464eac60da96345513964», а не «12345».

Стратегии хэш-атак

Значит, у злоумышленника есть хешированная версия моего пароля, и нет возможности изменить ее на 12345. Мне не о чем беспокоиться, верно? НЕПРАВИЛЬНО!

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

wordlist-bruteforce- взлом хэша

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

Заключение

Алгоритмы хеширования становятся все более совершенными. Математики и компьютерщики постоянно разрабатывают криптографические алгоритмы хеширования с меньшей вероятностью коллизий. Однако важно помнить, что каким бы сильным ни был алгоритм хеширования, его всегда можно взломать с помощью атаки грубой силы. Хорошей новостью является то, что вы также можете легко защититься от этих атак, просто следуя передовой политике паролей.

Читайте также: