-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathpasswords.xml
More file actions
194 lines (190 loc) · 7.63 KB
/
Copy pathpasswords.xml
File metadata and controls
194 lines (190 loc) · 7.63 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
185
186
187
188
189
190
191
192
193
194
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f012b2761819e0ab25ff8cf4bac6655cfbc6fcff Maintainer: sobak Status: ready -->
<chapter xml:id="faq.passwords" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Bezpieczne haszowanie haseł</title>
<titleabbrev>Haszowanie haseł</titleabbrev>
<simpara>
Ta sekcja wyjaśnia powody, dla których należy używać funkcji haszujących
(skrótu) do zabezpieczania haseł, a także jak zrobić to efektywnie.
</simpara>
<qandaset>
<qandaentry xml:id="faq.passwords.hashing">
<question>
<simpara>
Czemu hasła podawane przez użytkowników powinny być haszowane?
</simpara>
</question>
<answer>
<simpara>
Haszowanie haseł jest jedną z podstawowych metod zapewniania bezpieczeństwa, która
musi być uwzględniona na etapie projektowania aplikacji lub usługi, która przyjmuje hasła
od użytkowników. Bez haszowania dowolne przechowywane hasła mogą
mogą paść ofiarą kradzieży w wypadku naruszenia źródła danych, a
potem natychmiast użyte nie tylko do zaatakowania aplikacji lub usługi, ale także
kont użytkowników w innych usługach, jeżeli nie używają oni
unikalnych haseł.
</simpara>
<simpara>
Stosując funkcję skrótu do haseł użytkowników przed ich zapisaniem,
odgadnięcie oryginalnego hasła przez atakującego staje się niemal niewykonalne,
a my wciąż będziemy mogli porównywać wynikowy hasz do oryginalnego hasła.
</simpara>
<simpara>
Należy jednak zauważyć, że haszowanie haseł chroni jedynie przed
ich wykradnięciem z miejsca przechowywania danych, ale już nie przed
przechwyceniem przez złośliwy kod wstrzyknięty do samej aplikacji
lub usługi.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.passwords.fasthash">
<question>
<simpara>
Dlaczego popularne funkcje haszujące jak <function>md5</function> czy
<function>sha1</function> nie nadają się do haszowania haseł?
</simpara>
</question>
<answer>
<simpara>
Algorytmy haszujące takie jak MD5, SHA1 czy SHA256 zostały zaprojektowane
tak, by były bardzo szybkie i wydajne. Przy użyciu nowoczesnych technik i sprzętu,
trywialne stały się ataki typu <quote>brute force</quote> na wyniku działania tych funkcji
tak, aby odgadnąć oryginalne dane wejściowe.
</simpara>
<simpara>
Ze względu na to, jak szybko dzisiejsze komputery potrafią <quote>odwrócić</quote> te algorytmy
haszujące, wielu profesjonalistów z zakresu bezpieczeństwa nie poleca ich
stosowania do haszowania haseł.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.passwords.bestpractice">
<question>
<simpara>
Jak powinny być haszowane hasła, jeśli popularne funkcje skrótu nie
nadają się do tego?
</simpara>
</question>
<answer>
<simpara>
Podczas haszowania haseł dwa najważniejsze aspekty to
koszt obliczeniowy oraz sól. Im bardziej kosztowny obliczeniowo
jest algorytm haszujący, tym dłużej zajmie aby poddać wynik jego działania
atakowi brute force.
</simpara>
<simpara>
PHP udostępnia
<link linkend="book.password">wbudowane API do haszowania haseł</link>, które
bezpiecznie obsługuje zarówno <link linkend="function.password-hash">haszowanie</link>
oraz <link linkend="function.password-verify">weryfikację haseł</link>
w poprawny sposób.
</simpara>
<simpara>
Do haszowania haseł sugeruje się użycie algorytmu Blowfish, który
jest także domyślnym algorytmem używanym przez API do haszowania haseł, jako że
jest on zdecydowanie bardziej kosztowny obliczeniowo niż MD5 lub SHA1, a przy tym
wciąż jest skalowalny.
</simpara>
<simpara>
Do haszowania haseł może nadać się także funkcja <function>crypt</function>,
ale sugeruje się jej wykorzystanie tylko w celu osiągnięcia kompatybilności
z innymi systemami.
Zamiast tego zdecydowanie zaleca się użycie
<link linkend="book.password">wbudowanego API haszowania haseł</link>,
gdy tylko jest to możliwe.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.passwords.salt">
<question>
<simpara>
Czym jest sól?
</simpara>
</question>
<answer>
<simpara>
Sól kryptograficzna to dane, które są stosowane podczas procesu haszowania,
aby uniemożliwić wyszukanie wyniku działania algorytmu na
listach wcześniej obliczonych par haszy i ich danych wejściowych,
znanych jako tęczowe tablice.
</simpara>
<simpara>
W prostych słowach, sól to trochę dodatkowych danych, które powodują,
że hasze stają się znacznie trudniejsze do złamania. Istnieje wiele
usług online, które posiadają rozbudowane listy wcześniej obliczonych haszy
oraz oryginalnych danych wejściowych dla tych haszy. użycie soli powoduje,
że znalezienie wynikowego hasza na takich listach jest mało prawdopodobne
lub wręcz niemożliwe.
</simpara>
<simpara>
<function>password_hash</function> stworzy losową sól, jeśli nie została
ona podana. Ogólnie rzecz biorąc jest to najprostsze i najbezpieczniejsze
podejście.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.password.storing-salts">
<question>
<simpara>
Jak przechowywana jest sól?
</simpara>
</question>
<answer>
<simpara>
Jeśli użyta została funkcja <function>password_hash</function> lub
<function>crypt</function>, zwrócona przez nią wartość zawiera także
sól jako element wygenerowanego hasza. Ta wartość powinna być zapisana w
niezmienionej postaci w bazie danych, gdyż zawiera informacje o tym,
jaka funkcja haszująca została wykorzystana do jej stworzenia i można taką
wartość przekazać bezpośrednio do <function>password_verify</function> podczas
weryfikacji hasła.
</simpara>
<warning>
<simpara>
Aby uniknąć ataków opartych o czas do sprawdzenia haseł powinna być
zawsze wykorzystywana funkcja <function>password_verify</function>,
a nie ponowne obliczenie hasza i porównanie wyników.
</simpara>
</warning>
<simpara>
Poniższy diagram pokazuje format wartości zwracanej przez
<function>crypt</function> oraz <function>password_hash</function>. Jak
widać jest ona samodzielna, zawiera wszystkie informacje
na temat algorytmu oraz soli wymaganej do późniejszej weryfikacji hasła.
</simpara>
<para>
<mediaobject>
<alt>
Elementy wartości zwracanej przez funkcje password_hash oraz crypt to
kolejno: wybrany algorytm, opcje algorytmu, wykorzystana sól
oraz zahaszowane hasło.
</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
-->