-
Notifications
You must be signed in to change notification settings - Fork 79
Expand file tree
/
Copy pathpasswords.xml
More file actions
184 lines (181 loc) · 10.6 KB
/
passwords.xml
File metadata and controls
184 lines (181 loc) · 10.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f012b2761819e0ab25ff8cf4bac6655cfbc6fcff Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="faq.passwords" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Безопасное и надежное хеширование паролей</title>
<titleabbrev>Хеширование паролей</titleabbrev>
<simpara>
Раздел объясняет, почему пароли защищают функциями хеширования,
и как захешировать пароль так, чтобы его было трудно раскрыть.
</simpara>
<qandaset>
<qandaentry xml:id="faq.passwords.hashing">
<question>
<simpara>
Почему требуется хешировать пароли пользователей?
</simpara>
</question>
<answer>
<simpara>
Хеширование паролей — приоритетный фактор безопасности,
который учитывают при разработке приложения или службы, которые принимают
пароли пользователей. Без хеширования пароли, которые хранятся,
украдут, если хранилище данных скомпрометируют,
а затем немедленно применят для компрометации
и приложения или службы, и учётных записей пользователей в других службах,
если пользователи других служб не установили уникальные пароли.
</simpara>
<simpara>
Алгоритм, который применяют для хеширования паролей пользователей перед сохранением,
серьёзно затрудняет раскрытие исходного
пароля злоумышленником, при этом доступ к сравнению хеша с исходным паролем
в будущем сохраняется.
</simpara>
<simpara>
Важно: хеширование защищает пароли только
от компрометации в хранилище данных, но не защищает пароли от перехвата
вредоносным кодом, который внедрили в само приложение или службу.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.passwords.fasthash">
<question>
<simpara>
Почему стандартные функции хеширования наподобие <function>md5</function>
и <function>sha1</function> нельзя использовать для защиты паролей?
</simpara>
</question>
<answer>
<simpara>
Алгоритмы хеширования наподобие MD5, SHA1 и SHA256 спроектировали
быстрыми и эффективными, а данные, которые эти алгоритмы давали на выходе, затрудняли раскрытие паролей.
Но текущие техники и компьютерное оборудование сделали тривиальным перебор вывода этих алгоритмов
методом <quote>brute force</quote> (англ. букв. «грубой силы») для определения исходных входных данных.
</simpara>
<simpara>
Из-за скорости, с которой компьютеры научились <quote>обращать</quote>
эти алгоритмы хеширования, аналитики в области компьютерной безопасности
рекомендуют не использовать эти алгоритмы для хеширования паролей.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.passwords.bestpractice">
<question>
<simpara>
Как хешировать пароли, если нельзя использовать стандартные функции?
</simpara>
</question>
<answer>
<simpara>
В хешировании паролей выделяются два самых важных фактора: цена вычисления и соль.
Повышение вычислительной сложности алгоритма хеширования
увеличивает время, которое потребуется для перебора вывода алгоритма методом «грубой силы».
</simpara>
<simpara>
PHP поддерживает <link linkend="book.password">встроенный API-интерфейс хеширования паролей</link>,
который безопасно обрабатывает как <link linkend="function.password-hash">хеширование</link>,
так и <link linkend="function.password-verify">проверку паролей</link>.
</simpara>
<simpara>
Пароли рекомендуют хешировать алгоритмом Blowfish, который
также применяют по умолчанию в API-интерфейсе хеширования паролей,
поскольку этот алгоритм намного затратнее с точки зрения вычислительной сложности,
чем алгоритм MD5 или SHA1, но при этом по-прежнему масштабируем.
</simpara>
<simpara>
Функция <function>crypt</function> также доступна для хеширования
паролей, но её рекомендуют только для взаимодействия с другими системами.
Вместо этой функции рекомендуют хешировать пароли через
<link linkend="book.password">встроенный API-интерфейс хеширования паролей</link>,
когда возможно.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.passwords.salt">
<question>
<simpara>
Что такое соль?
</simpara>
</question>
<answer>
<simpara>
Криптографическая соль — данные, которые участвуют в хешировании
и которые исключают поиск вывода, который сгенерировало хеширование,
в списке предварительно вычисленных пар хешей и их входных данных,
который знают как «радужную» таблицу.
</simpara>
<simpara>
В упрощённой терминологии, соль — фрагмент дополнительных данных, которые
серьёзно затрудняют взлом хешей. Интернет наполняют службы,
которые содержат открытые списки исходных паролей и хешей, которые заранее вычислили
для этих паролей. Соли делает маловероятным или невозможным поиск
хеша в таких списках.
</simpara>
<simpara>
Функция <function>password_hash</function> создаст случайную соль, если её не передали,
и часто это доступная и одновременно безопасная защита паролей.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.password.storing-salts">
<question>
<simpara>
Как хранится соль?
</simpara>
</question>
<answer>
<simpara>
При хешировании паролей функцией <function>password_hash</function> или других строк
функцией <function>crypt</function> значение, которые возвращают функции, уже содержит соль
как часть хеша, который сгенерировали функции. Значение возврата сохраняют как есть,
поскольку хеш включает информацию о функции хеширования,
а затем без посредников передают в функцию <function>password_verify</function>
при проверке пароля.
</simpara>
<warning>
<simpara>
Вместо перехеширования и сравнения результата с хешем в хранилище,
вызывают функцию <function>password_verify</function>,
чтобы избежать атак по времени.
</simpara>
</warning>
<simpara>
Следующая диаграмма показывает формат значения, которое возвращают функции
<function>crypt</function> и <function>password_hash</function>.
На диаграмме видно, что значения содержат внутри себя информацию об алгоритме
и соли, которая требуется для будущей проверки пароля.
</simpara>
<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
-->