Files
php-doc-ru/reference/openssl/functions/openssl-encrypt.xml
2024-07-26 11:14:07 +03:00

248 lines
8.6 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: 6ad22de1921790bfccc8c9a2590a48ab63bf8dd3 Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.openssl-encrypt" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>openssl_encrypt</refname>
<refpurpose>Шифрует данные</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type class="union"><type>string</type><type>false</type></type><methodname>openssl_encrypt</methodname>
<methodparam><modifier role="attribute">#[\SensitiveParameter]</modifier><type>string</type><parameter>data</parameter></methodparam>
<methodparam><type>string</type><parameter>cipher_algo</parameter></methodparam>
<methodparam><modifier role="attribute">#[\SensitiveParameter]</modifier><type>string</type><parameter>passphrase</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>options</parameter><initializer>0</initializer></methodparam>
<methodparam choice="opt"><type>string</type><parameter>iv</parameter><initializer>""</initializer></methodparam>
<methodparam choice="opt"><type>string</type><parameter role="reference">tag</parameter><initializer>&null;</initializer></methodparam>
<methodparam choice="opt"><type>string</type><parameter>aad</parameter><initializer>""</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter>tag_length</parameter><initializer>16</initializer></methodparam>
</methodsynopsis>
<para>
Функция шифрует данные с заданным шифром и ключом и возвращает необработанную строку, либо
строку, закодированную в base64.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>data</parameter></term>
<listitem>
<para>
Данные для шифрования.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>cipher_algo</parameter></term>
<listitem>
<para>
Метод шифрования. Список доступных методов можно получить с помощью функции
<function>openssl_get_cipher_methods</function>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>passphrase</parameter></term>
<listitem>
<para>
Кодовая фраза. Если кодовая фраза укорочена, чем ожидалось, она автоматически дополняется
символами <literal>NUL</literal>; если кодовая фраза длиннее, чем ожидалось, она
автоматически усекается.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>options</parameter></term>
<listitem>
<para>
<parameter>options</parameter> можно задать одной из констант:
<constant>OPENSSL_RAW_DATA</constant>,
<constant>OPENSSL_ZERO_PADDING</constant>
или <constant>OPENSSL_DONT_ZERO_PAD_KEY</constant>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>iv</parameter></term>
<listitem>
<para>
Ненулевой инициализирующий вектор.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>tag</parameter></term>
<listitem>
<para>
Тег аутентификации, передаваемый по ссылке, в режиме шифрования AEAD (GCM или CCM).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>aad</parameter></term>
<listitem>
<para>
Дополнительные аутентифицированные данные.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>tag_length</parameter></term>
<listitem>
<para>
Длина параметра <parameter>tag</parameter>. Для режима GCM должно быть от 4 до 16.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Функция возвращает зашифрованную строку&return.falseforfailure;.
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
Функция выдаёт ошибку уровня <constant>E_WARNING</constant>, если в параметр
<parameter>cipher_algo</parameter> передали неизвестный алгоритм шифрования.
</para>
<para>
Функция выдаёт ошибку уровня <constant>E_WARNING</constant>, если в параметр
<parameter>iv</parameter> передали пустое значение.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>7.1.0</entry>
<entry>
Добавили параметры <parameter>tag</parameter>, <parameter>aad</parameter>
и <parameter>tag_length</parameter>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Пример шифрования AES с аутентификацией в режиме GCM в PHP 7.1+</title>
<programlisting role="php">
<![CDATA[
<?php
// $key должен быть сгенерирован заранее криптографически безопасным образом,
// например, функцией openssl_random_pseudo_bytes
$plaintext = "данные для шифрования";
$cipher = "aes-128-gcm";
if (in_array($cipher, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
// Сохраняем $cipher, $iv и $tag для дальнейшей расшифровки
$original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
echo $original_plaintext."\n";
}
?>
]]>
</programlisting>
</example>
<example>
<title>Пример шифрования AES с аутентификацией до PHP 7.1</title>
<programlisting role="php">
<![CDATA[
<?php
// $key должен быть сгенерирован заранее криптографически безопасным образом,
// например, функцией openssl_random_pseudo_bytes
$plaintext = "данные для шифрования";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );
// Расшифровка....
$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
if (hash_equals($hmac, $calcmac)) // Сравнение, которое не подвержено атаке по времени
{
echo $original_plaintext."\n";
}
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>openssl_decrypt</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
-->