-
Notifications
You must be signed in to change notification settings - Fork 58
/
Copy pathcrypt.xml
369 lines (353 loc) · 13.3 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
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: a706ea6af5e3015603a3ecc0264b846af0ca7a7a Maintainer: seros Status: ready -->
<!-- Reviewed: no Maintainer: seros -->
<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://docbook.org/ns/docbook" xml:id="function.crypt">
<refnamediv>
<refname>crypt</refname>
<refpurpose>Hash de cadenas de un sólo sentido</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>string</type><methodname>crypt</methodname>
<methodparam><type>string</type><parameter>str</parameter></methodparam>
<methodparam choice="opt"><type>string</type><parameter>salt</parameter></methodparam>
</methodsynopsis>
<para>
<function>crypt</function> devolverá el hash de un string utilizando el
algoritmo estándar basado en <abbrev>DES</abbrev> de Unix o
algoritmos alternativos que puedan estar disponibles en el sistema.
</para>
<para>
El parámetro <parameter>salt</parameter> es opcional. Sin embargo, <function>crypt</function> crea una contraseña débil sin <parameter>salt</parameter>. PHP 5.6 o posterior emiten un error de nivel E_NOTICE sin él. Asegúrese de especificar una sal lo suficientemente fuerte para mayor seguridad.
</para>
<para>
<function>password_hash</function> utiliza un hash fuerte, genera una sal fuerte, y aplica los redondeos necesarios automáticamente. <function>password_hash</function> es una envoltura simple de <function>crypt</function> compatible con los hash de contraseñas existentes. Se aconseja el uso de <function>password_hash</function>.
</para>
<para>
Algunos sistemas operativos soportan más de un tipo de hash. De
hecho, a veces el algoritmo estándar basado en DES es sustituído por un
algoritmo basado en MD5. El tipo de hash se dispara mediante el argumento salt.
Antes de la versión 5.3, PHP determinaba los algoritmos disponibles durante la instalación,
basándose en la función crypt() del sistema. Si no se proporciona una sal, PHP
autogenerará o una sal estándar de dos caracteres (DES), o una de doce
caracteres (MD5), dependiendo de la disponibilidad de la función crypt() de MD5. PHP establece una
constante llamada <constant>CRYPT_SALT_LENGTH</constant> la cual indica la
sal de mayor longitud permitida por los hash disponibles.
</para>
<para>
La función <function>crypt</function> estándar basada en DES devuelve la
sal como los primeros dos caracteres de la salida. También utiliza solamente los
primeros ocho caracteres de <parameter>str</parameter>, por lo que cadenas más largas
que empiecen con los mismos ocho caracteres, generarán el mismo resultado
(cuando se utiliza la misma sal).
</para>
<simpara>
En sistemas donde la función crypt() soporta múltiples
tipos de hash, las siguientes contantes se establecen en 0 o 1,
dependiendo de que si el tipo dado está disponible:
</simpara>
<itemizedlist>
<listitem>
<simpara>
<constant>CRYPT_STD_DES</constant> - Hash estándar basado en DES con un salt de dos caracteres
del alfabeto "./0-9A-Za-z". Utilizar caracteres no válidos en el salt causará que crypt()
falle.
</simpara>
</listitem>
<listitem>
<simpara>
<constant>CRYPT_EXT_DES</constant> - Hash extendido basado en DES. El "salt" es un
string de 9 caracteres que consiste en un guión bajo seguido de 4 bytes del conteo de iteraciones
y 4 bytes del salt. Estos están codificados como caracteres imprimibles, 6 bits por caracter, por lo menos,
el carácter significativo primero. Los valores del 0 al 63 son codificados como "./0-9A-Za-z". Utilizar caracteres
no válidos en el salt causará que crypt() falle.
</simpara>
</listitem>
<listitem>
<simpara>
<constant>CRYPT_MD5</constant> - Hash MD5 con un salt de doce caracteres comenzando con
$1$
</simpara>
</listitem>
<listitem>
<simpara>
<constant>CRYPT_BLOWFISH</constant> - Hash con Blowfish con un salt como
sigue: "$2a$", "$2x$" o "$2y$", un parámetro de coste de dos dígitos, "$", y
22 caracteres del alfabeto "./0-9A-Za-z". Utilizar caracteres fuera de este
rango en el salt causará que crypt() devuelva una cadena de longitud cero.
El parámetro de coste de dos dígitos es el logaritmo en base 2 de la cuenta de la
iteración del algoritmo hach basado en Blowfish subyacente, y debe estar
en el rango 04-31; los valores fuera de este rango causarán que crypt() falle.
Los hashes "$2x$" potencialmente débiles; los hashes "$2a$" son compatible y
y mitigan esta debilidad. Para los nuevos hashes, se debe utilizar "$2y$".
</simpara>
</listitem>
<listitem>
<simpara>
<constant>CRYPT_SHA256</constant> - Hash SHA-256 con un salt de dieciséis caracteres
prefijado con $5$. Si el strig del salt inicia con 'rounds=<N>$', el valor numérico de N
se utiliza para indicar cuantas veces el bucle del hash se debe ejecutar, muy similar al parámetro
de costo en Blowfish. El número de rondas por defecto es 5000, hay un mínimo de
1000 y un máximo de 999,999,999. Cualquier selección de N por fuera de este rango será truncada al
límite más cercano.
</simpara>
</listitem>
<listitem>
<simpara>
<constant>CRYPT_SHA512</constant> - Hash SHA-512 con un salt de dieciséis caracteres
prefijado con $6$. Si el strig del salt inicia con 'rounds=<N>$', el valor numérico de N
se utiliza para indicar cuantas veces el bucle del hash se debe ejecutar, muy similar al parámetro
de costo en Blowfish. El número de rondas por defecto es 5000, hay un mínimo de
1000 y un máximo de 999,999,999. Cualquier selección de N por fuera de este rango será truncada al
límite más cercano.
</simpara>
</listitem>
</itemizedlist>
<note>
<para>
A partir de PHP 5.3.0, PHP contiene su propia implementación y la utilizará
si el sistema carece de soporte para uno o varios de los algoritmos.
</para>
</note>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>str</parameter></term>
<listitem>
<para>
El string al que realizarle el hash.
</para>
<caution>
<para>
El uso del algoritmo <constant>CRYPT_BLOWFISH</constant> resultará
en que el parámetro <parameter>str</parameter> sea truncado a una
longitud máxima de 72 caracteres.
</para>
</caution>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>salt</parameter></term>
<listitem>
<para>
Un string opcional de salt para la base del hash. Si no se proporciona, el
comportamiento se define por la aplicación del algoritmo y puede conducir a
resultados inesperados.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Devuelve un string con el hash o un string que es más corto que 13 caracteres
y que se garantiza que difiere del salt en caso de fallo.
</para>
<warning>
<simpara>
Cuando se validan contraseñas, se debería usar una función de comparación de
strings que no sea vulnerable a ataques de temporización para comparar la salida de
<function>crypt</function> con el hash conocido anteriormente. PHP 5.6 y siguientes
proporcionan <function>hash_equals</function> para este propósito.
</simpara>
</warning>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>5.6.5</entry>
<entry>
Cuando se da la cadena de fallo "*0" como
<parameter>salt</parameter>, ahora se devuelve "*1" por consistencia
con otras implementaciones de crypt. Antes de esta versión, PHP 5.6
devolvía incorrectamente un hash DES.
</entry>
</row>
<row>
<entry>5.6.0</entry>
<entry>
Se emite una advertencia de seguridad E_NOTICE si se omite <parameter>salt</parameter>.
</entry>
</row>
<row>
<entry>5.5.21</entry>
<entry>
Cuando se da la cadena de fallo "*0" como
<parameter>salt</parameter>, ahora se devuelve "*1" por consistencia
con otras implementaciones de crypt. Antes de esta versión, PHP 5.5 (y
ramificaciones anteriores) devolvía incorrectamente un hash DES.
</entry>
</row>
<row>
<entry>5.3.7</entry>
<entry>
Se añadieron los modos de Blowfish <literal>$2x$</literal> y <literal>$2y$</literal>
para tratar con ataques de bit alto potenciales.
</entry>
</row>
<row>
<entry>5.3.2</entry>
<entry>
Agregado el crypt SHA-256 y SHA-512 basado en la
<link xlink:href="&url.crypt.sha;">implementación</link> de Ulrich Drepper.
</entry>
</row>
<row>
<entry>5.3.2</entry>
<entry>
Corregido el comportamiento de Blowfish sobre rondas no válidas para devolver el string
"failure" ("*0" or "*1"), en lugar de caer al DES.
</entry>
</row>
<row>
<entry>5.3.0</entry>
<entry>
PHP ahora contiene su propia implementación de los algoritmos MD5, DES estándar,
DES extendido y Blowfish y los utilizará si el sistema
carece de soporte para uno o varios de los algoritmos.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title><function>crypt</function> examples</title>
<programlisting role="php">
<![CDATA[
<?php
$hashed_password = crypt('mypassword'); // dejar que el salt se genera automáticamente
/* Se deben pasar todos los resultados de crypt() como el salt para la comparación de una
contraseña, para evitar problemas cuando diferentes algoritmos hash son utilizados. (Como
se dice arriba, el hash estándar basado en DES utiliza un salt de 2
caracteres, pero el hash basado en MD5 utiliza 12.) */
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
echo "¡Contraseña verificada!";
}
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Using <function>crypt</function> with htpasswd</title>
<programlisting role="php">
<![CDATA[
<?php
// Establece la contraseña
$password = 'mypassword';
// Obtiene el hash, dejando que el salt sea generado be automáticamente
$hash = crypt($password);
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Using <function>crypt</function> with different hash types</title>
<programlisting role="php">
<![CDATA[
<?php
/* Estas sales son solamente ejemplos, y no deberían usarse textualmente en su código.
Debería generar una sal distinta correctamente formada para cada contraseña.
*/
if (CRYPT_STD_DES == 1) {
echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "\n";
}
if (CRYPT_EXT_DES == 1) {
echo 'Extended DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . "\n";
}
if (CRYPT_MD5 == 1) {
echo 'MD5: ' . crypt('rasmuslerdorf', '$1$rasmusle$') . "\n";
}
if (CRYPT_BLOWFISH == 1) {
echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";
}
if (CRYPT_SHA256 == 1) {
echo 'SHA-256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "\n";
}
if (CRYPT_SHA512 == 1) {
echo 'SHA-512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "\n";
}
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Standard DES: rl.3StKT.4T8M
Extended DES: _J9..rasmBYk8r9AiWNc
MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0
Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
SHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6
SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<note>
<simpara>
No hay función de descifrado, ya que <function>crypt</function> utiliza un
algoritmo de un solo sentido.
</simpara>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>hash_equals</function></member>
<member><function>password_hash</function></member>
<member><function>md5</function></member>
<member>La extensión <link linkend="ref.mcrypt">Mcrypt</link></member>
<member>La página man de la función crypt de Unix para más información</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
-->