<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'faq.passwords.php',
    1 => 'Хеширование паролей',
    2 => 'Безопасное и надежное хеширование паролей',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'ЧАВО',
  ),
  'prev' => 
  array (
    0 => 'faq.using.php',
    1 => 'Использование PHP',
  ),
  'next' => 
  array (
    0 => 'faq.html.php',
    1 => 'PHP и HTML',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'faq/passwords.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.passwords" class="chapter">
  <h1 class="title">Безопасное и надежное хеширование паролей</h1>

  

  <p class="simpara">
   Раздел объясняет, почему пароли защищают функциями хеширования,
   и как захешировать пароль так, чтобы его было трудно раскрыть.
  </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.passwords.hashing">
     
      Почему требуется хешировать пароли пользователей?
     
    </a></li><li><a href="#faq.passwords.fasthash">
     
      Почему стандартные функции хеширования наподобие md5
      и sha1 нельзя использовать для защиты паролей?
     
    </a></li><li><a href="#faq.passwords.bestpractice">
     
      Как хешировать пароли, если нельзя использовать стандартные функции?
     
    </a></li><li><a href="#faq.passwords.salt">
     
      Что такое соль?
     
    </a></li><li><a href="#faq.password.storing-salts">
     
      Как хранится соль?
     
    </a></li></ol></div>
   <dl class="qandaentry" id="faq.passwords.hashing">
    <dt><strong>
     <p class="simpara">
      Почему требуется хешировать пароли пользователей?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Хеширование паролей — приоритетный фактор безопасности,
      который учитывают при разработке приложения или службы, которые принимают
      пароли пользователей. Без хеширования пароли, которые хранятся,
      украдут, если хранилище данных скомпрометируют,
      а затем немедленно применят для компрометации
      и приложения или службы, и учётных записей пользователей в других службах,
      если пользователи других служб не установили уникальные пароли.
     </p>
     <p class="simpara">
      Алгоритм, который применяют для хеширования паролей пользователей перед сохранением,
      серьёзно затрудняет раскрытие исходного
      пароля злоумышленником, при этом доступ к сравнению хеша с исходным паролем
      в будущем сохраняется.
     </p>
     <p class="simpara">
      Важно: хеширование защищает пароли только
      от компрометации в хранилище данных, но не защищает пароли от перехвата
      вредоносным кодом, который внедрили в само приложение или службу.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.passwords.fasthash">
    <dt><strong>
     <p class="simpara">
      Почему стандартные функции хеширования наподобие <span class="function"><a href="function.md5.php" class="function">md5()</a></span>
      и <span class="function"><a href="function.sha1.php" class="function">sha1()</a></span> нельзя использовать для защиты паролей?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Алгоритмы хеширования наподобие MD5, SHA1 и SHA256 спроектировали
      быстрыми и эффективными, а данные, которые эти алгоритмы давали на выходе, затрудняли раскрытие паролей.
      Но текущие техники и компьютерное оборудование сделали тривиальным перебор вывода этих алгоритмов
      методом <q class="quote">brute force</q> (англ. букв. «грубой силы») для определения исходных входных данных.
     </p>
     <p class="simpara">
      Из-за скорости, с которой компьютеры научились <q class="quote">обращать</q>
      эти алгоритмы хеширования, аналитики в области компьютерной безопасности
      рекомендуют не использовать эти алгоритмы для хеширования паролей.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.passwords.bestpractice">
    <dt><strong>
     <p class="simpara">
      Как хешировать пароли, если нельзя использовать стандартные функции?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      В хешировании паролей выделяются два самых важных фактора: цена вычисления и соль.
      Повышение вычислительной сложности алгоритма хеширования
      увеличивает время, которое потребуется для перебора вывода алгоритма методом «грубой силы».
     </p>
     <p class="simpara">
      PHP поддерживает <a href="book.password.php" class="link">встроенный API-интерфейс хеширования паролей</a>,
      который безопасно обрабатывает как <a href="function.password-hash.php" class="link">хеширование</a>,
      так и <a href="function.password-verify.php" class="link">проверку паролей</a>.
     </p>
     <p class="simpara">
      Пароли рекомендуют хешировать алгоритмом Blowfish, который
      также применяют по умолчанию в API-интерфейсе хеширования паролей,
      поскольку этот алгоритм намного затратнее с точки зрения вычислительной сложности,
      чем алгоритм MD5 или SHA1, но при этом по-прежнему масштабируем.
     </p>
     <p class="simpara">
      Функция <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> также доступна для хеширования
      паролей, но её рекомендуют только для взаимодействия с другими системами.
      Вместо этой функции рекомендуют хешировать пароли через
      <a href="book.password.php" class="link">встроенный API-интерфейс хеширования паролей</a>,
      когда возможно.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.passwords.salt">
    <dt><strong>
     <p class="simpara">
      Что такое соль?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Криптографическая соль — данные, которые участвуют в хешировании
      и которые исключают поиск вывода, который сгенерировало хеширование,
      в списке предварительно вычисленных пар хешей и их входных данных,
      который знают как «радужную» таблицу.
     </p>
     <p class="simpara">
      В упрощённой терминологии, соль — фрагмент дополнительных данных, которые
      серьёзно затрудняют взлом хешей. Интернет наполняют службы,
      которые содержат открытые списки исходных паролей и хешей, которые заранее вычислили
      для этих паролей. Соли делает маловероятным или невозможным поиск
      хеша в таких списках.
     </p>
     <p class="simpara">
      Функция <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> создаст случайную соль, если её не передали,
      и часто это доступная и одновременно безопасная защита паролей.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.password.storing-salts">
    <dt><strong>
     <p class="simpara">
      Как хранится соль?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      При хешировании паролей функцией <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> или других строк
      функцией <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> значение, которые возвращают функции, уже содержит соль
      как часть хеша, который сгенерировали функции. Значение возврата сохраняют как есть,
      поскольку хеш включает информацию о функции хеширования,
      а затем без посредников передают в функцию <span class="function"><a href="function.password-verify.php" class="function">password_verify()</a></span>
      при проверке пароля.
     </p>
     <div class="warning"><strong class="warning">Внимание</strong>
      <p class="simpara">
       Вместо перехеширования и сравнения результата с хешем в хранилище,
       вызывают функцию <span class="function"><a href="function.password-verify.php" class="function">password_verify()</a></span>,
       чтобы избежать атак по времени.
      </p>
     </div>
     <p class="simpara">
      Следующая диаграмма показывает формат значения, которое возвращают функции
      <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> и <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span>.
      На диаграмме видно, что значения содержат внутри себя информацию об алгоритме
      и соли, которая требуется для будущей проверки пароля.
     </p>
     <p class="para">
      <div class="mediaobject">
       
       <div class="imageobject">
        <img src="images/2a34c7f2e658f6ae74f3869f2aa5886f-crypt-text-rendered.svg" alt="
        Компоненты значения, которое возвращают функции password_hash и crypt, идут в следующем порядке:
        алгоритм хеширования, опции алгоритма, соль и хеш пароля.
       " width="690" height="192" />
       </div>
      </div>
     </p>
    </dd>
   </dl>
  

 </div>
<?php manual_footer($setup); ?>