1
0
mirror of https://github.com/php/doc-ru.git synced 2026-04-28 01:33:30 +02:00
Files
archived-doc-ru/reference/password/functions/password-hash.xml
T
2024-05-21 19:49:38 +03:00

452 lines
18 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 5bc68add3da3cd18c40f851e944b15095d3a26aa Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.password-hash" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>password_hash</refname>
<refpurpose>Создаёт хеш пароля</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>string</type><methodname>password_hash</methodname>
<methodparam><modifier role="attribute">#[\SensitiveParameter]</modifier><type>string</type><parameter>password</parameter></methodparam>
<methodparam><type class="union"><type>string</type><type>int</type><type>null</type></type><parameter>algo</parameter></methodparam>
<methodparam choice="opt"><type>array</type><parameter>options</parameter><initializer>[]</initializer></methodparam>
</methodsynopsis>
<para>
Функция <function>password_hash</function> создаёт хеш пароля через сильный необратимый алгоритм хеширования.
</para>
<simpara>
Поддерживаются следующие алгоритмы:
</simpara>
<para>
<itemizedlist>
<listitem>
<simpara>
<constant>PASSWORD_DEFAULT</constant> — функция выберет алгоритм bcrypt (по умолчанию с PHP 5.5.0).
Обратите внимание, алгоритм может измениться на более
сильный, когда такой добавится в PHP. При изменении алгоритма и длина результата
также может измениться. Поэтому длину поля для хранения
в базе данных лучше устанавливать более 60 символов (255 символов будет хорошим значением).
</simpara>
</listitem>
<listitem>
<simpara>
<constant>PASSWORD_BCRYPT</constant> — функция выберет алгоритм
<constant>CRYPT_BLOWFISH</constant>. Генерирует стандартный хеш с идентификатором "$2y$",
совместимый с тем, который генерирует функция <function>crypt</function>.
В результате будет сгенерирована строка длиной 60 символов&return.falseforfailure;.
</simpara>
</listitem>
<listitem>
<simpara>
<constant>PASSWORD_ARGON2I</constant> — функция выберет алгоритм хеширования Argon2i.
Этот алгоритм будет доступен, только если PHP собран с поддержкой Argon2.
</simpara>
</listitem>
<listitem>
<simpara>
<constant>PASSWORD_ARGON2ID</constant> — функция выберет алгоритм хеширования Argon2id.
Этот алгоритм будет доступен, только если PHP собран с поддержкой Argon2.
</simpara>
</listitem>
</itemizedlist>
</para>
<simpara>
Поддерживаемые опции для <constant>PASSWORD_BCRYPT</constant>:
</simpara>
<para>
<itemizedlist>
<listitem>
<para>
<literal>salt</literal> (<type>string</type>) — для самостоятельного задания соли для хеширования.
Обратите внимание, что это приведёт к переопределению и предотвратит
автоматическое создание соли.
</para>
<para>
Если не задали, то функция <function>password_hash</function> будет генерировать
случайную соль для каждого хешируемого пароля. Это предпочтительный
режим работы.
</para>
<warning>
<para>
Эту опцию объявили устаревшей.
Рекомендуется использовать автоматически генерируемую соль.
Начиная с PHP 8.0.0 соль, которую задали явно, игнорируется.
</para>
</warning>
</listitem>
<listitem>
<para>
<literal>cost</literal> (<type>int</type>) — задаёт алгоритмическую сложность.
Пример с этой опцией можно посмотреть на странице, посвящённой
функции <function>crypt</function>.
</para>
<para>
Если не задано, то будет выбрано значение по умолчанию: <literal>10</literal>.
Это хорошая базовая стоимость, но можно увеличить её,
если позволяет производительность оборудования.
</para>
</listitem>
</itemizedlist>
</para>
<simpara>
Поддерживаемые опции для <constant>PASSWORD_ARGON2I</constant>
и <constant>PASSWORD_ARGON2ID</constant>:
</simpara>
<para>
<itemizedlist>
<listitem>
<para>
<literal>memory_cost</literal> (<type>int</type>) — максимальный размер
памяти (в килобайтах), которая будет использована для вычисления хеша Argon2.
По умолчанию будет выбрано значение константы <constant>PASSWORD_ARGON2_DEFAULT_MEMORY_COST</constant>.
</para>
</listitem>
<listitem>
<para>
<literal>time_cost</literal> (<type>int</type>) — максимально возможное время,
которое можно потратить на вычисление хеша Argon2.
По умолчанию будет выбрано значение константы <constant>PASSWORD_ARGON2_DEFAULT_TIME_COST</constant>.
</para>
</listitem>
<listitem>
<para>
<literal>threads</literal> (<type>int</type>) — количество потоков, которые
можно задействовать для вычисления хеша Argon2.
По умолчанию будет выбрано значение константы <constant>PASSWORD_ARGON2_DEFAULT_THREADS</constant>.
</para>
<warning>
<para>
Доступно только тогда, когда в PHP доступен модуль libargon2, но не при реализации libsodium.
</para>
</warning>
</listitem>
</itemizedlist>
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<variablelist>
<varlistentry>
<term><parameter>password</parameter></term>
<listitem>
<para>
&password.parameter.password;
</para>
<caution>
<para>
Использование алгоритма <constant>PASSWORD_BCRYPT</constant> приведёт
к обрезанию поля <parameter>password</parameter> до максимальной длины — 72 байта.
</para>
</caution>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>algo</parameter></term>
<listitem>
<para>
&password.parameter.algo;
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>options</parameter></term>
<listitem>
<para>
&password.parameter.options;
</para>
<para>
Если не задали, функция использует стандартная стоимость, и сгенерирует соль
автоматически.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Функция возвращает хешированный пароль.
</para>
<para>
Алгоритм, который выбрала функция, стоимость и соль возвращаются как часть хеша.
Поэтому информацию, которая требуется для проверки хеша, функция включит
в хеш. Это позволит функции <function>password_verify</function> проверять
хеш без отдельного хранения информации о соли и алгоритме.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.0.0</entry>
<entry>
Функция <function>password_hash</function> больше не возвращает значение &false;, если возникла ошибка.
Вместо этого функция выбросит исключение <classname>ValueError</classname>,
если алгоритм хеширования пароля недействителен, или <classname>Error</classname>,
если хеширование пароля не удалось из-за неизвестной ошибки.
</entry>
</row>
<row>
<entry>8.0.0</entry>
<entry>
Параметр <parameter>algo</parameter> теперь принимает значение &null;.
</entry>
</row>
<row>
<entry>7.4.0</entry>
<entry>
Параметр <parameter>algo</parameter> теперь ожидает строку (&string;), но всё ещё принимает
целое число (&integer;) для обратной совместимости.
</entry>
</row>
<row>
<entry>7.4.0</entry>
<entry>
Модуль sodium обеспечивает альтернативную реализацию паролей Argon2.
</entry>
</row>
<row>
<entry>7.3.0</entry>
<entry>
Добавили поддержку алгоритма хеширования паролей Argon2id через алгоритм <constant>PASSWORD_ARGON2ID</constant>.
</entry>
</row>
<row>
<entry>7.2.0</entry>
<entry>
Добавили поддержку хеширующего алгоритма Argon2i через алгоритм <constant>PASSWORD_ARGON2I</constant>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Пример использования функции <function>password_hash</function></title>
<programlisting role="php">
<![CDATA[
<?php
/**
* Просто хотим захешировать пароль с настройками по умолчанию.
* Значит, будет выбран алгоритм BCRYPT и результат будет длиной 60 символов.
*
* Помните, что алгоритм по умолчанию может измениться в будущем, так что
* имеет смысл заранее позаботиться о том, чтобы система хранения хешей
* смогла хранить более 60 символов (а лучше 255)
*/
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
]]>
</screen>
</example>
</para>
<para>
<example>
<title>
Пример использования функции <function>password_hash</function> с ручным указанием стоимости
</title>
<programlisting role="php">
<![CDATA[
<?php
/**
* Тут увеличиваем алгоритмическую стоимость BCRYPT до 12.
* Но это никак не скажется на длине полученного результата, она останется 60 символов
*/
$options = [
'cost' => 12,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Пример поиска хорошего значения стоимости для функции <function>password_hash</function></title>
<programlisting role="php">
<![CDATA[
<?php
/**
* Этот код замерит скорость выполнения операции с разными значениями алгоритмической сложности хеширования
* на вашем сервере и определит
* его максимальное значение, не приводящее к деградации производительности. Хорошее базовое
* значение — 10, но если ваш сервер достаточно мощный, то можно
* задать и больше. Данный скрипт ищет максимальное значение, при котором
* хеширование уложится в значение ≤ 350 миллисекундам, что считается приемлемой задержкой
* для систем, которые обрабатывают интерактивные входы.
*/
$timeTarget = 0.350; // 350 миллисекунд
$cost = 8;
do {
$cost++;
$start = microtime(true);
password_hash("test", PASSWORD_BCRYPT, ["cost" => $cost]);
$end = microtime(true);
} while (($end - $start) < $timeTarget);
echo "Оптимальная стоимость: " . $cost;
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Оптимальная стоимость: 12
]]>
</screen>
</example>
</para>
<para>
<example>
<title>
Пример использования функции <function>password_hash</function> с алгоритмом Argon2i
</title>
<programlisting role="php">
<![CDATA[
<?php
echo 'Хеш Argon2i: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Хеш Argon2i: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<caution>
<para>
Настоятельно рекомендуется использовать автоматическую генерацию соли.
Данная функция самостоятельно создаст хорошую соль, если вы не будете ей мешать
подсовывая свою.
</para>
<para>
Как было замечено выше, опция <literal>salt</literal> была объявлена
устаревшей в PHP 7.0 и будет вызывать соответствующее предупреждение.
Поддержка ручного задания соли была удалена в PHP 8.0.
</para>
</caution>
<note>
<para>
Рекомендуется протестировать данную функцию на вашем оборудовании для определения
оптимального значения алгоритмической сложности. Убедитесь, что с выбранной
сложностью функция выполняется быстрее 350 миллисекунд для интерактивных
систем. Скрипт в приведённом выше примере поможет выбрать оптимальное значение.
</para>
</note>
<note>
<simpara>
Обновление поддерживаемых алгоритмов для этой функции (или изменение значения по
умолчанию) обязаны следовать правилам:
</simpara>
<para>
<itemizedlist>
<listitem>
<simpara>
Любой новый алгоритм должен присутствовать в ядре как минимум
1 полный релиз PHP для того, чтобы его можно было установить по умолчанию.
Таким образом, если, к примеру, новый алгоритм был добавлен в
7.5.5, то задать по умолчанию его можно будет только в 7.7 (7.6 будет тем самым
полным релизом, в течение которого он должен присутствовать, от 7.6.0 до 7.7.0). Но
если новый алгоритм добавлен в 7.6.0, то его также можно будет задать по умолчанию
в версии 7.7.0.
</simpara>
</listitem>
<listitem>
<simpara>
Алгоритм по умолчанию может быть изменён только в полном релизе
(7.3.0, 8.0.0 и т. д.), но не в промежуточных. Единственное исключение —
это критическая уязвимость, найденная в текущем алгоритме.
</simpara>
</listitem>
</itemizedlist>
</para>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>password_verify</function></member>
<member><function>password_needs_rehash</function></member>
<member><function>crypt</function></member>
<member><function>sodium_crypto_pwhash_str</function></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
-->