-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy pathcrypt.xml
256 lines (246 loc) · 9.94 KB
/
crypt.xml
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: d76a7fe17dd2488e47d664a8ab38e161b13ac843 Maintainer: hirokawa Status: ready -->
<!-- CREDITS: shimooka,mumumu -->
<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://docbook.org/ns/docbook" xml:id="function.crypt">
<refnamediv>
<refname>crypt</refname>
<refpurpose>文字列の一方向のハッシュ化を行う</refpurpose>
</refnamediv>
<refsynopsisdiv>
¬e.not-bin-safe;
</refsynopsisdiv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>string</type><methodname>crypt</methodname>
<methodparam><modifier role="attribute">#[\SensitiveParameter]</modifier><type>string</type><parameter>string</parameter></methodparam>
<methodparam><type>string</type><parameter>salt</parameter></methodparam>
</methodsynopsis>
<para>
<function>crypt</function> 文字列のハッシュを返します。
Unix 標準の <abbrev>DES</abbrev> ベースのアルゴリズムか、
代替のアルゴリズムを使用します。
<function>password_verify</function> は
<function>crypt</function> と互換性があるので、
<function>crypt</function> が作ったパスワードハッシュは
<function>password_verify</function> でも使えます。
</para>
<para>
PHP 8.0.0 より前のバージョンでは、<parameter>salt</parameter>
パラメータは必須ではありませんでした。ただ、これを省略すると
<function>crypt</function>
が作るハッシュが弱いものになってしまっていました。
このパラメータを省略した場合には、E_NOTICE が発生していました。
十分に強い salt を指定して、セキュリティを確保しましょう。
</para>
<para>
<function>password_hash</function> は、強力なハッシュを使い、強力なソルトを生成して、それを複数回自動的に適用します。
<function>password_hash</function> は <function>crypt</function> のシンプルなラッパーであり、既存のパスワードハッシュと互換性があります。
<function>password_hash</function> を使うことを推奨します。
</para>
<para>
ハッシュ方式は、salt 引数によって決まります。
salt を省略した場合は、標準の 2 文字 (DES) の salt を自動生成します。
あるいは、MD5 crypt() が使えれば 12 文字 (MD5) の salt を自動生成します。
PHP の定数 <constant>CRYPT_SALT_LENGTH</constant> には、
ハッシュで使用できる salt の最大長が格納されています。
</para>
<para>
標準の DES ベースの場合、<function>crypt</function>
は出力の最初の 2 文字を salt として使用します。また、
<parameter>string</parameter> の最初の 8 文字しか使用しません。
つまり、最初の 8 文字が同じである長い文字列は、
同じ salt を使う限り同じ結果となります。
</para>
<simpara>
以下のハッシュ形式がサポートされています:
</simpara>
<itemizedlist>
<listitem>
<simpara>
<constant>CRYPT_STD_DES</constant> - 標準の DES ベースのハッシュで、
アルファベット "./0-9A-Za-z" からなる 2 文字の salt を使用するもの。
salt として無効な文字を使うと crypt() は失敗します。
</simpara>
</listitem>
<listitem>
<simpara>
<constant>CRYPT_EXT_DES</constant> - 拡張した DES ベースのハッシュ。
"salt" は 9 文字で、
アンダースコアの後に 4 文字の反復回数と 4 文字の salt が続きます。
これらの4文字それぞれが、24ビットにエンコードされ、
下位の文字から順に並びます。
<literal>0</literal> から <literal>63</literal> までの値は
<literal>./0-9A-Za-z</literal> の範囲内の文字でエンコードされます。
salt に無効な文字を使うと crypt() は失敗します。
</simpara>
</listitem>
<listitem>
<simpara>
<constant>CRYPT_MD5</constant> - $1$ ではじまる 12 文字の salt を使用する MD5 ハッシュ。
</simpara>
</listitem>
<listitem>
<simpara>
<constant>CRYPT_BLOWFISH</constant> - Blowfish ハッシュ。salt の形式は、
"$2a$" か "$2x$" あるいは "$2y$"、2 桁のコストパラメータ、"$"、そして文字 "./0-9A-Za-z"
からなる 22 文字となります。
この範囲外の文字を salt に使うと、crypt() は長さゼロの文字列を返します。
2 桁のコストパラメータは反復回数の 2 を底とする対数で、
これは Blowfish ベースのハッシュアルゴリズムで使います。
この値は 04 から 31 までの範囲でなければならず、
それ以外の値の場合は crypt() は失敗します。
"$2x$" ハッシュは潜在的に弱いハッシュです。
"$2a$" ハッシュはこれと互換性があり、この弱点を軽減します。
新しくハッシュを生成する場合は、"$2y$" を使うべきです。
</simpara>
</listitem>
<listitem>
<simpara>
<constant>CRYPT_SHA256</constant> - SHA-256 ハッシュに
$5$ で始まる 16 文字の salt を組み合わせたもの。salt 文字列が
'rounds=<N>$' で始まる場合は、数値 N がハッシュループの実行回数を表します。
これは Blowfish のコストパラメータのようなものです。
rounds のデフォルトは 5000 で、1000 から 999,999,999 までの値を指定できます。
この範囲外の N を指定すると、近い方の境界値に切り詰められます。
</simpara>
</listitem>
<listitem>
<simpara>
<constant>CRYPT_SHA512</constant> - SHA-512 ハッシュに
$6$ で始まる 16 文字の salt を組み合わせたもの。salt 文字列が
'rounds=<N>$' で始まる場合は、数値 N がハッシュループの実行回数を表します。
これは Blowfish のコストパラメータのようなものです。
rounds のデフォルトは 5000 で、1000 から 999,999,999 までの値を指定できます。
この範囲外の N を指定すると、近い方の境界値に切り詰められます。
</simpara>
</listitem>
</itemizedlist>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>string</parameter></term>
<listitem>
<para>
ハッシュしたい文字列。
</para>
<caution>
<para>
<constant>CRYPT_BLOWFISH</constant> を使うと、
<parameter>string</parameter> が最大 72 バイトまでに切り詰められます。
</para>
</caution>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>salt</parameter></term>
<listitem>
<para>
ハッシュのもととなる salt 文字列。省略した場合の挙動は
アルゴリズムの実装によって決まるので、予期せぬ結果となることがあり得ます。
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
ハッシュした文字列を返します。
失敗した場合は、salt とは異なることが保証されている 13 文字未満の文字列を返します。
</para>
<warning>
<simpara>
パスワードを検証するときの文字列比較関数は、
タイミング攻撃に対して脆弱ではないものでなければいけません。
これをもちいて、<function>crypt</function> の出力と既知のハッシュとを比較します。
この比較を行うために、<function>hash_equals</function> 関数が使えます。
</simpara>
</warning>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.0.0</entry>
<entry>
<parameter>salt</parameter> は、オプションではなくなりました。
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title><function>crypt</function> の例</title>
<programlisting role="php">
<![CDATA[
<?php
$user_input = 'rasmuslerdorf';
$hashed_password = '$6$rounds=1000000$NJy4rIPjpOaU$0ACEYGg/aKCY3v8O8AfyiO7CTfZQ8/W231Qfh2tRLmfdvFD6XfHk12u6hMr9cYIA4hnpjLNSTRtUwYr9km9Ij/';
// PHP 以外のソフトウェアと互換性がある方法で、既存の crypt() ハッシュを検証します
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
echo "Password verified!";
}
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<note>
<simpara>
復号するための関数はありません。
<function>crypt</function> が使用しているのは単方向アルゴリズムだからです。
</simpara>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>hash_equals</function></member>
<member><function>password_hash</function></member>
<member>暗号化関数についての Unix man ページ</member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- 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
-->