mirror of
https://github.com/php/doc-ru.git
synced 2026-03-23 23:32:16 +01:00
185 lines
11 KiB
XML
185 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: f012b2761819e0ab25ff8cf4bac6655cfbc6fcff Maintainer: shein Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<chapter xml:id="faq.passwords" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
<title>Безопасное и надежное хеширование паролей</title>
|
||
<titleabbrev>Хеширование паролей</titleabbrev>
|
||
|
||
<simpara>
|
||
Раздел объясняет, почему пароли защищают функциями хеширования,
|
||
и как захешировать пароль так, чтобы его было трудно раскрыть.
|
||
</simpara>
|
||
|
||
<qandaset>
|
||
<qandaentry xml:id="faq.passwords.hashing">
|
||
<question>
|
||
<simpara>
|
||
Почему требуется хешировать пароли пользователей?
|
||
</simpara>
|
||
</question>
|
||
<answer>
|
||
<simpara>
|
||
Хеширование паролей — приоритетный фактор безопасности,
|
||
который учитывают при разработке приложения или службы, которые принимают
|
||
пароли пользователей. Без хеширования пароли, которые хранятся,
|
||
украдут, если хранилище данных скомпрометируют,
|
||
а затем немедленно применят для компрометации
|
||
и приложения или службы, и учётных записей пользователей в других службах,
|
||
если пользователи других служб не установили уникальные пароли.
|
||
</simpara>
|
||
<simpara>
|
||
Алгоритм, который применяют для хеширования паролей пользователей перед сохранением,
|
||
серьёзно затрудняет раскрытие исходного
|
||
пароля злоумышленником, при этом доступ к сравнению хеша с исходным паролем
|
||
в будущем сохраняется.
|
||
</simpara>
|
||
<simpara>
|
||
Важно: хеширование защищает пароли только
|
||
от компрометации в хранилище данных, но не защищает пароли от перехвата
|
||
вредоносным кодом, который внедрили в само приложение или службу.
|
||
</simpara>
|
||
</answer>
|
||
</qandaentry>
|
||
<qandaentry xml:id="faq.passwords.fasthash">
|
||
<question>
|
||
<simpara>
|
||
Почему стандартные функции хеширования наподобие <function>md5</function>
|
||
и <function>sha1</function> нельзя использовать для защиты паролей?
|
||
</simpara>
|
||
</question>
|
||
<answer>
|
||
<simpara>
|
||
Алгоритмы хеширования наподобие MD5, SHA1 и SHA256 спроектировали
|
||
быстрыми и эффективными, а данные, которые эти алгоритмы давали на выходе, затрудняли раскрытие паролей.
|
||
Но текущие техники и компьютерное оборудование сделали тривиальным перебор вывода этих алгоритмов
|
||
методом <quote>brute force</quote> (англ. букв. «грубой силы») для определения исходных входных данных.
|
||
</simpara>
|
||
<simpara>
|
||
Из-за скорости, с которой компьютеры научились <quote>обращать</quote>
|
||
эти алгоритмы хеширования, аналитики в области компьютерной безопасности
|
||
рекомендуют не использовать эти алгоритмы для хеширования паролей.
|
||
</simpara>
|
||
</answer>
|
||
</qandaentry>
|
||
<qandaentry xml:id="faq.passwords.bestpractice">
|
||
<question>
|
||
<simpara>
|
||
Как хешировать пароли, если нельзя использовать стандартные функции?
|
||
</simpara>
|
||
</question>
|
||
<answer>
|
||
<simpara>
|
||
В хешировании паролей выделяются два самых важных фактора: цена вычисления и соль.
|
||
Повышение вычислительной сложности алгоритма хеширования
|
||
увеличивает время, которое потребуется для перебора вывода алгоритма методом «грубой силы».
|
||
</simpara>
|
||
<simpara>
|
||
PHP поддерживает <link linkend="book.password">встроенный API-интерфейс хеширования паролей</link>,
|
||
который безопасно обрабатывает как <link linkend="function.password-hash">хеширование</link>,
|
||
так и <link linkend="function.password-verify">проверку паролей</link>.
|
||
</simpara>
|
||
<simpara>
|
||
Пароли рекомендуют хешировать алгоритмом Blowfish, который
|
||
также применяют по умолчанию в API-интерфейсе хеширования паролей,
|
||
поскольку этот алгоритм намного затратнее с точки зрения вычислительной сложности,
|
||
чем алгоритм MD5 или SHA1, но при этом по-прежнему масштабируем.
|
||
</simpara>
|
||
<simpara>
|
||
Функция <function>crypt</function> также доступна для хеширования
|
||
паролей, но её рекомендуют только для взаимодействия с другими системами.
|
||
Вместо этой функции рекомендуют хешировать пароли через
|
||
<link linkend="book.password">встроенный API-интерфейс хеширования паролей</link>,
|
||
когда возможно.
|
||
</simpara>
|
||
</answer>
|
||
</qandaentry>
|
||
<qandaentry xml:id="faq.passwords.salt">
|
||
<question>
|
||
<simpara>
|
||
Что такое соль?
|
||
</simpara>
|
||
</question>
|
||
<answer>
|
||
<simpara>
|
||
Криптографическая соль — данные, которые участвуют в хешировании
|
||
и которые исключают поиск вывода, который сгенерировало хеширование,
|
||
в списке предварительно вычисленных пар хешей и их входных данных,
|
||
который знают как «радужную» таблицу.
|
||
</simpara>
|
||
<simpara>
|
||
В упрощённой терминологии, соль — фрагмент дополнительных данных, которые
|
||
серьёзно затрудняют взлом хешей. Интернет наполняют службы,
|
||
которые содержат открытые списки исходных паролей и хешей, которые заранее вычислили
|
||
для этих паролей. Соли делает маловероятным или невозможным поиск
|
||
хеша в таких списках.
|
||
</simpara>
|
||
<simpara>
|
||
Функция <function>password_hash</function> создаст случайную соль, если её не передали,
|
||
и часто это доступная и одновременно безопасная защита паролей.
|
||
</simpara>
|
||
</answer>
|
||
</qandaentry>
|
||
<qandaentry xml:id="faq.password.storing-salts">
|
||
<question>
|
||
<simpara>
|
||
Как хранится соль?
|
||
</simpara>
|
||
</question>
|
||
<answer>
|
||
<simpara>
|
||
При хешировании паролей функцией <function>password_hash</function> или других строк
|
||
функцией <function>crypt</function> значение, которые возвращают функции, уже содержит соль
|
||
как часть хеша, который сгенерировали функции. Значение возврата сохраняют как есть,
|
||
поскольку хеш включает информацию о функции хеширования,
|
||
а затем без посредников передают в функцию <function>password_verify</function>
|
||
при проверке пароля.
|
||
</simpara>
|
||
<warning>
|
||
<simpara>
|
||
Вместо перехеширования и сравнения результата с хешем в хранилище,
|
||
вызывают функцию <function>password_verify</function>,
|
||
чтобы избежать атак по времени.
|
||
</simpara>
|
||
</warning>
|
||
<simpara>
|
||
Следующая диаграмма показывает формат значения, которое возвращают функции
|
||
<function>crypt</function> и <function>password_hash</function>.
|
||
На диаграмме видно, что значения содержат внутри себя информацию об алгоритме
|
||
и соли, которая требуется для будущей проверки пароля.
|
||
</simpara>
|
||
<para>
|
||
<mediaobject>
|
||
<alt>
|
||
Компоненты значения, которое возвращают функции password_hash и crypt, идут в следующем порядке:
|
||
алгоритм хеширования, опции алгоритма, соль и хеш пароля.
|
||
</alt>
|
||
<imageobject>
|
||
<imagedata fileref="en/faq/figures/crypt-text-rendered.svg" width="690" depth="192" format="SVG"/>
|
||
</imageobject>
|
||
</mediaobject>
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
</qandaset>
|
||
|
||
</chapter><!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|