<?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 => 'uk',
  ),
  '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' => 'uk',
    '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">
     
      Що таке &quot;сіль&quot;?
     
    </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 розроблені бути дуже швидкими та
      ефективними. З сучасною технікою та комп&#039;ютерним обладнанням стало
      легко <q class="quote">зламати</q> результат цих алгоритмів, щоб визначити
      початковий текст.
     </p>
     <p class="simpara">
      Через те, як швидко сучасні комп&#039;ютери можуть запустити такий алгоритм
      <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">
      Під час гешування паролів двома найважливішими факторами є витрати на
      обчислення та т. зв. &quot;сіль&quot;. Чим більше обчислень має виконати алгоритм,
      тим довше триватиме злам результату його обчислень.
     </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">
      Що таке &quot;сіль&quot;?
     </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); ?>