Yii2: Шифрование Openssl

yii2 шифрование aes opensslЕсли вам понадобилось использовать openssl шифрование в yii 2.0 приложении, можно использовать готовое расширение nickcv/yii2-encrypter.

В данном расширении реализовано двухстороннее AES шифрование с ключом 128 или 256 бит.

Также, расширение позволяет кодировать зашифрованные данные в base64, что дает возможность хранить их в виде строк. Следует помнить, что кодирование base64 увеличивает объем данных примерно на одну треть.

Openssl используется вместо mcrypt, так как он показывает большую производительность, местами openssl до 30 раз быстрее.

Установка

Для установки желательно использовать composer.

Выполняем команду:

composer require --prefer-dist nickcv/yii2-encrypter "*"

При этом, composer сам добавит строку «nickcv/yii2-encrypter»: «*» в раздел require файла composer.json приложения и установит расширение, с учетом всех зависимостей.

Настройка

После установки возможны два варианта: ручное описание настроек в файле web.php или использование установщика из командной строки. Во втором случае, установщик создаст случайные пароль шифрования и initialization vector (IV).

Ручная настройка

Добавьте следующие строки в раздел components файла web.php:

return [
    'class'=>'\nickcv\encrypter\components\Encrypter',
    'globalPassword'=>'YourPassword',
    'iv'=>'YourIV',
    'useBase64Encoding'=>true,
    'use256BitesEncoding'=>false,
];

Рекомендуется использовать кодирование base64 для облегчения хранения зашифрованных данных.

Замечание: initialization vector всегда должен быть блинной 16 байт. Обращайте внимание, когда задаете его unicode строкой.

Автоматическая настройка

Добавьте в файл настроек консольного приложения console.php следующие модули:

'bootstrap' => ['log','encrypter'],

А так же, добавьте модуль шифрования в разделе модулей:

'modules' => [
    ...
    'encrypter' => 'nickcv\encrypter\Module',
    ...
],

Теперь можно из командной строки выполнить команду ./yii encrypter с правами root. В результате будет создан файл настроек app/config/encrypter.php, содержащий сгенерированные пароль шифрования и initialization vector.

Осталось только подключить созданный файл в web.php:

'encrypter' => require(__DIR__ . DIRECTORY_SEPARATOR . 'encrypter.php'),

Простой пример использования шифрования в yii 2.0

Для шифрования текстовой строки, достаточно в любом месте приложения выполнить:

\Yii::$app->encrypter->encrypt('string to encrypt');

и для расшифровки, соответственно:

\Yii::$app->encrypter->decrypt('string to decrypt');

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

В расширении yii2-encrypter включено поведение, что позволяет легко подключить шифрование к модели ActiveRecord.

Пример использования шифрования в модели ActiveRecord в yii 2.0:

public function behaviors()
{
    return [
        'encryption' => [
            'class' => '\nickcv\encrypter\behaviors\EncryptionBehavior',
            'attributes' => [
                'attributeName',
                'otherAttributeName',
            ],
        ],
    ];
}

В данном случае, поведение позволяет автоматически шифровать данные перед сохранением в базу данных и расшифровывать их после получения из нее.

Важно: Поведение всегда использует текущие настройки расширения для шифрования и расшифровки данных. Изменение настроек сделает невозможной расшифровку данных, зашифрованных с предыдущими настройками.

Примечания

Расшифровка данных без знания пароля и initialization vector очень трудоемка, поэтому рекомендуется сохранять их копии в надежном месте.

Двухстороннее шифрование не подходит для хранения паролей. В данном случае, целесообразнее использовать одностороннее шифрование, например sha1 с обязательным добавлением соли.

3 thoughts on “Yii2: Шифрование Openssl

  1. Иван

    Как посоветуете быть в случае, если нужно внедрить шифрование на уже готовом проекте и наполненной БД?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *