1
0
mirror of https://github.com/php/doc-uk.git synced 2026-03-23 22:52:14 +01:00
Files
archived-doc-uk/faq/passwords.xml

190 lines
10 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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
-->