Обзор

Примечание: требуется, чтобы расширение openssl PHP присутствовало в системе

Не поддерживает небезопасные алгоритмы с режимами работы:

des*, rc2*, rc4*, des*, *ecb

Phalcon предоставляет средства шифрования через компонент Phalcon\Crypt . Этот класс предлагает простые объектно-ориентированные оболочки для библиотеки шифрования openssl PHP.

По умолчанию этот компонент использует шифр AES-256-CFB.

Шифр AES-256 используется среди других мест в SSL/TLS через Интернет. Он считается одним из лучших шифров. Теоретически он не поддается взлому, так как комбинации клавиш массивны. Хотя АНБ классифицировало это в Пакете B, они также рекомендовали использовать более высокие, чем 128-битные ключи для шифрования.

Примечание: Вы должны использовать длину ключа, соответствующую текущему алгоритму. Для алгоритма aes-256-cfb по умолчанию длина ключа составляет 32 байта.

Основное Использование

Этот компонент спроектирован так, чтобы быть очень простым в использовании:

<?php

use Phalcon\Crypt;

$key = "12345"; // Ваша комбинация багажа

$crypt     = new Crypt();
$text      = 'Это текст, который вы хотите зашифровать.';
$encrypted = $crypt->encrypt($text, $key);

echo $crypt->decrypt($encrypted, $key);

Если в конструкторе не передаются никакие параметры, то компонент будет использовать шифр aes-256-cfb с подписью по умолчанию. Вы всегда можете изменить шифр, а также отключить подпись.

<?php

use Phalcon\Crypt;

$key = "12345"; // Ваша комбинация багажа

$crypt     = new Crypt();

$crypt
    ->setCipher('aes-256-gcm')
    ->useSigning(false)
;

$text      = 'Это текст, который вы хотите зашифровать.';
$encrypted = $crypt->encrypt($text, $key);

echo $crypt->decrypt($encrypted, $key);

Шифрование

Метод encrypt() шифрует строку. Компонент будет использовать ранее заданный шифр, который был задан в конструкторе или явно. Если ключ не передается в параметре, то будет использоваться ранее установленный ключ.

<?php

use Phalcon\Crypt;

$key = "12345"; // Ваша комбинация ключа

$crypt = new Crypt();
$crypt->setKey($key);

$text      = 'Это текст, который вы хотите зашифровать.';
$encrypted = $crypt->encrypt($text);

или использовать ключ в качестве второго параметра

<?php

use Phalcon\Crypt;

$key = "12345"; // Ваша комбинация ключа

$crypt     = new Crypt();
$text      = 'Это текст, который вы хотите зашифровать.';
$encrypted = $crypt->encrypt($text, $key);

The method will also internally use signing by default. You can always use useSigning(false) prior to the method call to disable it.

Расшифровка

Метод decrypt() расшифровывает строку. Аналогично encrypt() компонент будет использовать ранее заданный шифр, который был задан в конструкторе или явно. Если ключ не передается в параметре, то будет использоваться ранее установленный ключ.

<?php

use Phalcon\Crypt;

$key = "12345"; // Ваша комбинация ключа

$crypt = new Crypt();
$crypt->setKey($key);

$text      = 'T4\xb1\x8d\xa9\x98\x05\\\x8c\xbe\x1d\x07&[\x99\x18\xa4~Lc1\xbeW\xb3';
$encrypted = $crypt->decrypt($text);

или использовать ключ в качестве второго параметра

<?php

use Phalcon\Crypt;

$key = "12345"; // Ваша комбинация ключа

$crypt     = new Crypt();
$crypt->setKey($key);

$text      = 'T4\xb1\x8d\xa9\x98\x05\\\x8c\xbe\x1d\x07&[\x99\x18\xa4~Lc1\xbeW\xb3';
$encrypted = $crypt->decrypt($text, $key);

Этот метод также будет внутренне использовать подпись по умолчанию. Вы всегда можете использовать useSigning(false) до вызова метода, чтобы отключить его.

Шифрование Base64

В encryptBase64() может использоваться, чтобы зашифровать строку в понятный URL-адрес, путь. Он использует encrypt() внутренне и принимает текст и, возможно, ключ элемента для шифрования. Существует также третий параметр safe (по умолчанию false) , который будет выполнять замену строк для не дружественных к URL символов, таких как  + или /.

Расшифровка Base64

В decryptBase64() может использоваться, чтобы расшифровать строку в понятный URL-адрес, путь. Подобно encryptBase64(), он использует функцию decrypt() внутренне и принимает текст и, возможно, ключ элемента для шифрования. Существует также третий параметр safe (по умолчанию false) , который будет выполнять замену строк для ранее замененных не дружественных к URL символов, таких как + или /.

Исключения

Исключения, создаваемые в компоненте Phalcon\Crypt, будут иметь тип [Phalcon\Crypt\Exception][config-exception]. Однако если вы используете подпись и вычисленный хэш для decrypt() не совпадает, то будет брошен Phalcon\Crypt\Mismatch. Эти исключения можно использовать для выборочного перехвата исключений, создаваемых только из этого компонента.

<?php

use Phalcon\Crypt\Mismatch;
use Phalcon\Mvc\Controller;

class IndexController extends Controller
{
    public function index()
    {
        try {
            // Получить некоторые значения конфигурации
            $this->crypt->decrypt('hello');
        } catch (Mismatch $ex) {
            echo $ex->getMessage();
        }
    }
}

Функциональность

Шифры

Геттер getCipher() возвращает текущий выбранный шифр. Если ни один из них не был явно определен ни сеттером setCipher(), ни конструктором объекта, то по умолчанию выбирается aes-256-cfb. Предпочтительным шифром является aes-256-gcm.

Вы всегда можете получить массив всех доступных шифров для вашей системы, вызвав getAvailableCiphers().

Алгоритм хэширования

Геттер getHashAlgo() возвращает алгоритм хеширования, используемый компонентом. Если ни один из них не был явно определен сеттером setHashAlgo() , то будет использоваться sha256 . Если определенный хэш-алгоритм недоступен в системе или неверен, то будет выдан [Phalcon\Crypt\Exception][crypt=exception].

Вы всегда можете получить массив всех доступных алгоритмов хеширования для вашей системы, вызвав getAvailableHashAlgos().

Ключи

Компонент предлагает геттер и сеттер для ключа, который будет использоваться. После установки ключа он будет использоваться для любой операции шифрования или дешифрования (при условии, что параметр ключа не определен при использовании этих методов).

  • getKey(): Возвращает ключ шифрования.
  • setKey() Устанавливает ключ шифрования.

Вы всегда должны создавать как можно более безопасные ключи.  12345 может быть хорош для вашей комбинации багажа или password1 для вашей электронной почты, но для вашего приложения вы должны попробовать что-то гораздо более сложное. Чем длиннее и случайнее ключ, тем лучше. Длина курса зависит от выбранного шифра.

Несколько онлайн-сервисов могут генерировать случайный и сильный текст, который может быть использован для ключа. В качестве альтернативы вы всегда можете использовать методы hash() из компонента Phalcon\Security, который может предложить сильный ключ путем хэширования строки.

Подписание

Чтобы указать компоненту использовать подпись или нет, доступна функция useSigning . Он принимает логическое значение, которое устанавливает флаг внутренне, указывая, будет ли использоваться подпись или нет.

Верификация данных

Если выбранный шифр имеет тип gcm или ccm (то, что заканчивается именем шифра), для правильного шифрования или дешифрования данных компонента требуются данные проверки подлинности. Для этой операции доступны следующие методы:

  • setAuthTag()
  • setAuthData()
  • setAuthTagLength() - по умолчанию  16

Дополнение

Вы также можете задать заполнение, используемое компонентом, с помощью функции setPadding (). По умолчанию компонент будет использовать PADDING_DEFAULT. В дополнение константы:

  • PADDING_ANSI_X_923
  • PADDING_DEFAULT
  • PADDING_ISO_10126
  • PADDING_ISO_IEC_7816_4
  • PADDING_PKCS7
  • PADDING_SPACE
  • PADDING_ZERO

Инъекция Зависимостей

Как и большинство компонентов Phalcon, вы можете хранить объект Phalcon\Crypt в контейнере Phalcon\Di. Сделав это, вы сможете получить доступ к своему объекту конфигурации из контроллеров, моделей, представлений и любого компонента, реализующего Injectable.

Пример регистрации сервиса а также доступа к нему приведен ниже:

<?php

use Phalcon\Di\FactoryDefault;
use Phalcon\Crypt;

// Создание контейнера
$container = new FactoryDefault();

$container->set(
    'crypt',
    function () {
        $crypt = new Crypt();

        // Установка глобального ключа шифрования
        $crypt->setKey(
            "T4\xb1\x8d\xa9\x98\x05\\\x8c\xbe\x1d\x07&[\x99\x18\xa4~Lc1\xbeW\xb3"
        );

        return $crypt;
    },
    true
);

Этот компонент теперь доступен в ваших контроллерах с помощью ключа crypt

<?php

use MyApp\Models\Secrets;
use Phalcon\Crypt;
use Phalcon\Http\Request;
use Phalcon\Mvc\Controller;

/**
 * @property Crypt   $crypt
 * @property Request $request
 */
class SecretsController extends Controller
{
    public function saveAction()
    {
        $secret = new Secrets();

        $text = $this->request->getPost('text');

        $secret->content = $this->crypt->encrypt($text);

        if ($secret->save()) {
            $this->flash->success(
                'Секрет был успешно создан!'
            );
        }
    }
}