|
1 | 1 | <?xml version="1.0" encoding="utf-8"?>
|
2 |
| -<!-- EN-Revision: b8e1b1357def73f310c9f7405035b3acc0cb1eaf Maintainer: mproshchuk Status: ready --> |
| 2 | +<!-- EN-Revision: f012b2761819e0ab25ff8cf4bac6655cfbc6fcff Maintainer: mproshchuk Status: ready --> |
3 | 3 | <chapter xml:id="faq.passwords" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
4 | 4 | <title>Безпечне гешування паролів</title>
|
5 | 5 | <titleabbrev>Гешування паролів</titleabbrev>
|
6 | 6 |
|
7 |
| - <para> |
| 7 | + <simpara> |
8 | 8 | Цей розділ пояснює причини використання геш-функцій для убезпечення паролів,
|
9 | 9 | а також, як це зробити ефективно.
|
10 |
| - </para> |
| 10 | + </simpara> |
11 | 11 |
|
12 | 12 | <qandaset>
|
13 | 13 | <qandaentry xml:id="faq.passwords.hashing">
|
14 | 14 | <question>
|
15 |
| - <para> |
16 |
| - Навіщо мені гешувати користувацькі паролі моєї програми? |
17 |
| - </para> |
| 15 | + <simpara> |
| 16 | + Навіщо гешувати користувацькі паролі? |
| 17 | + </simpara> |
18 | 18 | </question>
|
19 | 19 | <answer>
|
20 |
| - <para> |
| 20 | + <simpara> |
21 | 21 | Гешування паролів є основним захисним заходом, що вживається під час
|
22 |
| - розробки програми, яка буде приймати паролі від користувачів. Без |
23 |
| - гешування будь-які паролі, що містяться у вашій базі даних, можуть бути |
24 |
| - вкрадені, якщо базу даних зламають, та негайно використані для зламу всієї |
25 |
| - вашої програми, а також облікових записів ваших користувачів у інших |
26 |
| - сервісах, якщо користувачі задали не унікальні паролі. |
27 |
| - </para> |
28 |
| - <para> |
29 |
| - Застосовуючи алгоритм гешування користувацьких паролів перед зберіганням |
30 |
| - їх у вашій базі даних, ви унеможливлюєте викриття зловмисником |
31 |
| - оригінального пароля, маючи при тому змогу у майбутньому порівнювати |
| 22 | + розробки програми або сервісу, що приймає паролі від користувачів. Без |
| 23 | + гешування будь-які збережені паролі можуть бути вкрадені, якщо сховище |
| 24 | + даних зламають, та негайно використані для зламу програми чи сервісу і |
| 25 | + облікових записів користувачів у інших сервісах, де використано такі ж |
| 26 | + паролі. |
| 27 | + </simpara> |
| 28 | + <simpara> |
| 29 | + Застосування алгоритму гешування користувацьких паролів перед збереженням |
| 30 | + унеможливлюєте викриття зловмисником оригінального пароля, маючи при тому змогу у майбутньому порівнювати |
32 | 31 | отриманий геш з наявним.
|
33 |
| - </para> |
34 |
| - <para> |
35 |
| - Важливо підкреслити, що гешування паролів лише захищає їх від того, щоб |
36 |
| - бути скомпрометованими у вашому сховищі даних, але аж ніяк не захищає їх |
37 |
| - від перехоплення зловмисним кодом, впровадженим у вашу програму. |
38 |
| - </para> |
| 32 | + </simpara> |
| 33 | + <simpara> |
| 34 | + Важливо підкреслити, що гешування паролів лише захищає їх від розкриття |
| 35 | + у сховищі даних, але не від перехоплення зловмисним кодом, вживленим у |
| 36 | + програму або сервіс. |
| 37 | + </simpara> |
39 | 38 | </answer>
|
40 | 39 | </qandaentry>
|
41 | 40 | <qandaentry xml:id="faq.passwords.fasthash">
|
42 | 41 | <question>
|
43 |
| - <para> |
| 42 | + <simpara> |
44 | 43 | Чому такі поширені геш-функції як <function>md5</function> і
|
45 | 44 | <function>sha1</function> не придатні для паролів?
|
46 |
| - </para> |
| 45 | + </simpara> |
47 | 46 | </question>
|
48 | 47 | <answer>
|
49 |
| - <para> |
| 48 | + <simpara> |
50 | 49 | Алгоритми гешування MD5, SHA1 та SHA256 розроблені бути дуже швидкими та
|
51 | 50 | ефективними. З сучасною технікою та комп'ютерним обладнанням стало
|
52 |
| - легко зламати результат цих алгоритмів, щоб визначити початковий текст. |
53 |
| - </para> |
54 |
| - <para> |
55 |
| - Через те, як швидко сучасні комп'ютери можуть запустити такий алгоритм в |
56 |
| - зворотньому напрямку, багато фахівців з безпеки наполягають не |
57 |
| - використовувати таке гешування. |
58 |
| - </para> |
| 51 | + легко <quote>зламати</quote> результат цих алгоритмів, щоб визначити |
| 52 | + початковий текст. |
| 53 | + </simpara> |
| 54 | + <simpara> |
| 55 | + Через те, як швидко сучасні комп'ютери можуть запустити такий алгоритм |
| 56 | + <quote>у зворотньому напрямку</quote>, багато фахівців з безпеки |
| 57 | + наполягають не використовувати таке гешування. |
| 58 | + </simpara> |
59 | 59 | </answer>
|
60 | 60 | </qandaentry>
|
61 | 61 | <qandaentry xml:id="faq.passwords.bestpractice">
|
62 | 62 | <question>
|
63 |
| - <para> |
64 |
| - Як мені гешувати паролі, якщо поширені геш-функції не придатні. |
65 |
| - </para> |
| 63 | + <simpara> |
| 64 | + Як гешувати паролі, якщо поширені геш-функції не придатні. |
| 65 | + </simpara> |
66 | 66 | </question>
|
67 | 67 | <answer>
|
68 |
| - <para> |
| 68 | + <simpara> |
69 | 69 | Під час гешування паролів двома найважливішими факторами є витрати на
|
70 | 70 | обчислення та т. зв. "сіль". Чим більше обчислень має виконати алгоритм,
|
71 | 71 | тим довше триватиме злам результату його обчислень.
|
72 |
| - </para> |
73 |
| - <para> |
| 72 | + </simpara> |
| 73 | + <simpara> |
74 | 74 | PHP має
|
75 | 75 | <link linkend="book.password">вбудований API гешування паролів</link>,
|
76 | 76 | який надає засоби як
|
77 | 77 | <link linkend="function.password-hash">гешування</link>, так і
|
78 | 78 | <link linkend="function.password-verify">перевірки паролів</link>
|
79 | 79 | безпечним способом.
|
80 |
| - </para> |
81 |
| - <!-- TODO Drop mention of crypt? --> |
82 |
| - <para> |
83 |
| - Інший спосіб — це функція <function>crypt</function>, яка підтримує |
84 |
| - декілька алгоритмів гешування. Використовуючи цю функцію, ви гарантовано |
85 |
| - оберете доступний алгоритм, адже PHP має власну реалізацію кожного |
86 |
| - підтримуваного алгоритму, навіть якщо один або декілька не підтримуються |
87 |
| - вашою системою. |
88 |
| - </para> |
89 |
| - <para> |
| 80 | + </simpara> |
| 81 | + <simpara> |
90 | 82 | Для гешування паролів рекомендується алгоритм Blowfish, який стандартно
|
91 | 83 | використовується API гешування паролів, оскільки він є набагато дорожчим
|
92 | 84 | в обчисленні, аніж MD5 або SHA1, залишаючись масштабованим.
|
93 |
| - </para> |
94 |
| - <para> |
95 |
| - Зауважте, якщо ви використовуєте <function>crypt</function> для перевірки |
96 |
| - пароля, вам необхідно подбати про запобігання часових атак, використовуючи |
97 |
| - однаковий час для порівняння рядків. Ані |
98 |
| - <link linkend="language.operators.comparison">оператори == і ===</link>, |
99 |
| - ані <function>strcmp</function> не виконують порівняння за однаковий |
100 |
| - проміжок часу. Тільки <function>password_verify</function> зробить це для |
101 |
| - вас, тож дуже просимо використовувати |
102 |
| - <link linkend="book.password">вбудований API гешування паролів</link> за |
| 85 | + </simpara> |
| 86 | + <simpara> |
| 87 | + Функція <function>crypt</function> також може гешувати паролі, але |
| 88 | + рекомендовано використовувати її тільки для підтримки сумісності з іншими |
| 89 | + системами. Натомість краще використовувати <link |
| 90 | + linkend="book.password">вбудований API гешування паролів</link> за |
103 | 91 | будь-якої можливості.
|
104 |
| - </para> |
| 92 | + </simpara> |
105 | 93 | </answer>
|
106 | 94 | </qandaentry>
|
107 | 95 | <qandaentry xml:id="faq.passwords.salt">
|
108 | 96 | <question>
|
109 |
| - <para> |
| 97 | + <simpara> |
110 | 98 | Що таке "сіль"?
|
111 |
| - </para> |
| 99 | + </simpara> |
112 | 100 | </question>
|
113 | 101 | <answer>
|
114 |
| - <para> |
| 102 | + <simpara> |
115 | 103 | Криптографічна сіль — це текст, який дописується до даних у процесі
|
116 | 104 | гешування, щоб унеможливити пошук результатів у списку попередньо
|
117 | 105 | обчислених пар гешів та їхніх вхідних даних, відомого як райдужна таблиця.
|
118 |
| - </para> |
119 |
| - <para> |
| 106 | + </simpara> |
| 107 | + <simpara> |
120 | 108 | Простими словами, сіль — це допоміжна частинка даних, яка значно ускладнює
|
121 | 109 | злам ваших гешів . Існує певна кількість онлайн сервісів з надання
|
122 | 110 | розширених списків попередньо обчислених гешів, а також їхніх вхідних
|
123 | 111 | даних. Використання солі робить малоймовірним або неможливим знаходження
|
124 | 112 | отриманого гешу в одному з цих списків.
|
125 |
| - </para> |
126 |
| - <para> |
| 113 | + </simpara> |
| 114 | + <simpara> |
127 | 115 | <function>password_hash</function> створить випадкову сіль, коли та не
|
128 | 116 | вказана, і це, як правило, найпростіший і найбезпечніший підхід.
|
129 |
| - </para> |
| 117 | + </simpara> |
130 | 118 | </answer>
|
131 | 119 | </qandaentry>
|
132 | 120 | <qandaentry xml:id="faq.password.storing-salts">
|
133 | 121 | <question>
|
134 |
| - <para> |
135 |
| - Як мені зберігати цю сіль? |
136 |
| - </para> |
| 122 | + <simpara> |
| 123 | + Де сіль зберігається? |
| 124 | + </simpara> |
137 | 125 | </question>
|
138 | 126 | <answer>
|
139 |
| - <para> |
| 127 | + <simpara> |
140 | 128 | У <function>password_hash</function> або <function>crypt</function>
|
141 | 129 | значення, що повертається, містить сіль як частину утвореного гешу. Це
|
142 |
| - значення має бути точно збережене у вашій базі даних, оскільки воно |
143 |
| - містить інформацію про геш-функцію, яка використовувалася, і потім може |
144 |
| - бути надано безпосередньо до <function>password_verify</function> або |
145 |
| - <function>crypt</function> під час перевірки паролів. |
146 |
| - </para> |
147 |
| - <para> |
148 |
| - На наступній діаграмі показано формат значення, що повертається функціями |
149 |
| - <function>crypt</function> або <function>password_hash</function>. Як |
150 |
| - можна побачити, значення є самодостатнім, з усією інформацією про |
151 |
| - алгоритм і сіль, необхідну для майбутньої перевірки пароля. |
152 |
| - </para> |
| 130 | + значення потрібно точно зберігати у базі даних, оскільки воно містить |
| 131 | + інформацію про геш-функцію, яка використовувалася, і потім може бути |
| 132 | + передано безпосередньо до функції <function>password_verify</function> для |
| 133 | + перевірки паролів. |
| 134 | + </simpara> |
| 135 | + <warning> |
| 136 | + <simpara> |
| 137 | + Задля убезпечення від часових атак потрібно завжди використовувати |
| 138 | + функцію <function>password_verify</function> замість повторного гешування |
| 139 | + і порівняння результату зі збереженим гешем. |
| 140 | + </simpara> |
| 141 | + </warning> |
| 142 | + <simpara> |
| 143 | + Наступна діаграма показує формат значення, що повертається функціями |
| 144 | + <function>crypt</function> або <function>password_hash</function>. |
| 145 | + Помітно, що значення є самодостатнім, з усією інформацією про алгоритм і |
| 146 | + сіль, необхідну для майбутньої перевірки пароля. |
| 147 | + </simpara> |
153 | 148 | <para>
|
154 | 149 | <mediaobject>
|
155 | 150 | <alt>
|
|
0 commit comments