mirror of
https://github.com/php/doc-uk.git
synced 2026-03-23 22:52:14 +01:00
190 lines
10 KiB
XML
190 lines
10 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: b8e1b1357def73f310c9f7405035b3acc0cb1eaf Maintainer: mproshchuk Status: ready -->
|
||
<chapter xml:id="faq.passwords" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
<title>Безпечне гешування паролів</title>
|
||
<titleabbrev>Гешування паролів</titleabbrev>
|
||
|
||
<para>
|
||
Цей розділ пояснює причини використання геш-функцій для убезпечення паролів,
|
||
а також, як це зробити ефективно.
|
||
</para>
|
||
|
||
<qandaset>
|
||
<qandaentry xml:id="faq.passwords.hashing">
|
||
<question>
|
||
<para>
|
||
Навіщо мені гешувати користувацькі паролі моєї програми?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Гешування паролів є основним захисним заходом, що вживається під час
|
||
розробки програми, яка буде приймати паролі від користувачів. Без
|
||
гешування будь-які паролі, що містяться у вашій базі даних, можуть бути
|
||
вкрадені, якщо базу даних зламають, та негайно використані для зламу всієї
|
||
вашої програми, а також облікових записів ваших користувачів у інших
|
||
сервісах, якщо користувачі задали не унікальні паролі.
|
||
</para>
|
||
<para>
|
||
Застосовуючи алгоритм гешування користувацьких паролів перед зберіганням
|
||
їх у вашій базі даних, ви унеможливлюєте викриття зловмисником
|
||
оригінального пароля, маючи при тому змогу у майбутньому порівнювати
|
||
отриманий геш з наявним.
|
||
</para>
|
||
<para>
|
||
Важливо підкреслити, що гешування паролів лише захищає їх від того, щоб
|
||
бути скомпрометованими у вашому сховищі даних, але аж ніяк не захищає їх
|
||
від перехоплення зловмисним кодом, впровадженим у вашу програму.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
<qandaentry xml:id="faq.passwords.fasthash">
|
||
<question>
|
||
<para>
|
||
Чому такі поширені геш-функції як <function>md5</function> і
|
||
<function>sha1</function> не придатні для паролів?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Алгоритми гешування MD5, SHA1 та SHA256 розроблені бути дуже швидкими та
|
||
ефективними. З сучасною технікою та комп'ютерним обладнанням стало
|
||
легко зламати результат цих алгоритмів, щоб визначити початковий текст.
|
||
</para>
|
||
<para>
|
||
Через те, як швидко сучасні комп'ютери можуть запустити такий алгоритм в
|
||
зворотньому напрямку, багато фахівців з безпеки наполягають не
|
||
використовувати таке гешування.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
<qandaentry xml:id="faq.passwords.bestpractice">
|
||
<question>
|
||
<para>
|
||
Як мені гешувати паролі, якщо поширені геш-функції не придатні.
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Під час гешування паролів двома найважливішими факторами є витрати на
|
||
обчислення та т. зв. "сіль". Чим більше обчислень має виконати алгоритм,
|
||
тим довше триватиме злам результату його обчислень.
|
||
</para>
|
||
<para>
|
||
PHP має
|
||
<link linkend="book.password">вбудований API гешування паролів</link>,
|
||
який надає засоби як
|
||
<link linkend="function.password-hash">гешування</link>, так і
|
||
<link linkend="function.password-verify">перевірки паролів</link>
|
||
безпечним способом.
|
||
</para>
|
||
<!-- TODO Drop mention of crypt? -->
|
||
<para>
|
||
Інший спосіб — це функція <function>crypt</function>, яка підтримує
|
||
декілька алгоритмів гешування. Використовуючи цю функцію, ви гарантовано
|
||
оберете доступний алгоритм, адже PHP має власну реалізацію кожного
|
||
підтримуваного алгоритму, навіть якщо один або декілька не підтримуються
|
||
вашою системою.
|
||
</para>
|
||
<para>
|
||
Для гешування паролів рекомендується алгоритм Blowfish, який стандартно
|
||
використовується API гешування паролів, оскільки він є набагато дорожчим
|
||
в обчисленні, аніж MD5 або SHA1, залишаючись масштабованим.
|
||
</para>
|
||
<para>
|
||
Зауважте, якщо ви використовуєте <function>crypt</function> для перевірки
|
||
пароля, вам необхідно подбати про запобігання часових атак, використовуючи
|
||
однаковий час для порівняння рядків. Ані
|
||
<link linkend="language.operators.comparison">оператори == і ===</link>,
|
||
ані <function>strcmp</function> не виконують порівняння за однаковий
|
||
проміжок часу. Тільки <function>password_verify</function> зробить це для
|
||
вас, тож дуже просимо використовувати
|
||
<link linkend="book.password">вбудований API гешування паролів</link> за
|
||
будь-якої можливості.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
<qandaentry xml:id="faq.passwords.salt">
|
||
<question>
|
||
<para>
|
||
Що таке "сіль"?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Криптографічна сіль — це текст, який дописується до даних у процесі
|
||
гешування, щоб унеможливити пошук результатів у списку попередньо
|
||
обчислених пар гешів та їхніх вхідних даних, відомого як райдужна таблиця.
|
||
</para>
|
||
<para>
|
||
Простими словами, сіль — це допоміжна частинка даних, яка значно ускладнює
|
||
злам ваших гешів . Існує певна кількість онлайн сервісів з надання
|
||
розширених списків попередньо обчислених гешів, а також їхніх вхідних
|
||
даних. Використання солі робить малоймовірним або неможливим знаходження
|
||
отриманого гешу в одному з цих списків.
|
||
</para>
|
||
<para>
|
||
<function>password_hash</function> створить випадкову сіль, коли та не
|
||
вказана, і це, як правило, найпростіший і найбезпечніший підхід.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
<qandaentry xml:id="faq.password.storing-salts">
|
||
<question>
|
||
<para>
|
||
Як мені зберігати цю сіль?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
У <function>password_hash</function> або <function>crypt</function>
|
||
значення, що повертається, містить сіль як частину утвореного гешу. Це
|
||
значення має бути точно збережене у вашій базі даних, оскільки воно
|
||
містить інформацію про геш-функцію, яка використовувалася, і потім може
|
||
бути надано безпосередньо до <function>password_verify</function> або
|
||
<function>crypt</function> під час перевірки паролів.
|
||
</para>
|
||
<para>
|
||
На наступній діаграмі показано формат значення, що повертається функціями
|
||
<function>crypt</function> або <function>password_hash</function>. Як
|
||
можна побачити, значення є самодостатнім, з усією інформацією про
|
||
алгоритм і сіль, необхідну для майбутньої перевірки пароля.
|
||
</para>
|
||
<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
|
||
-->
|