Skip to content

Криптография

В этом разделе мы рассмотрим следующие аспекты безопасности:

  • Генерация случайных данных
  • Шифрование и расшифровка
  • Проверка целостности данных

Для использования этих функций, вам нужно установить пакет yiisoft/security:

composer install yiisoft/security

Генерация псевдослучайных данных

Псевдослучайные данные используются во многих ситуациях. Например, при изменении пароля по email, вам необходимо сгенерировать токен, сохранить его в базу данных и отправить по email пользователю, чтобы он с помощью него подтвердил владение аккаунтом. Важно, чтобы этот токен был уникальным и его было трудно угадать, иначе есть вероятность, что атакующий может предсказать значение токена и сбросить пароль пользователя.

Класс \Yiisoft\Security\Random делает генерацию псевдослучайных данных простой:

php
$key = \Yiisoft\Security\Random::string(42);

Код выше даст вам случайную строку, включающую 42 символа.

Если вам нужны байты или целые числа, напрямую используйте функции PHP:

  • random_bytes() для генерации байт. Обратите внимание, что вывод может быть не ASCII.
  • random_int() для генерации целых чисел.

Шифрование и расшифровка

Yii предоставляет удобные вспомогательные функции для шифрования/расшифровки данных с помощью секретного ключа. Данные проходят через функцию шифрования таким образом, что только тот, кто знает секретный ключ, может расшифровать их. Например, вам нужно сохранить некоторую информацию в вашей базе данных, но вы должны быть уверены, что только пользователь, который знает секретный ключ, сможет расшифровать их (даже если кто-нибудь скомпрометирует базу данных приложения):

php
$encryptedData = (new \Yiisoft\Security\Crypt())->encryptByPassword($data, $password);

// сохранение данных в базу данных или другое хранилище
saveData($encryptedData);

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

php
// получение зашифрованных данных из базы данных или другого хранилища
$encryptedData = getEncryptedData();

$data = (new \Yiisoft\Security\Crypt())->decryptByPassword($encryptedData, $password);

Вы можете использовать ключ вместо пароля:

php
$encryptedData = (new \Yiisoft\Security\Crypt())->encryptByKey($data, $key);

// сохранение данных в базу данных или другое хранилище
saveData($encryptedData);

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

php
// получение зашифрованных данных из базы данных или другого хранилища
$encryptedData = getEncryptedData();

$data = (new \Yiisoft\Security\Crypt())->decryptByKey($encryptedData, $key);

Проверка целостности данных

Бывают ситуации, когда вам необходимо убедиться, что ваши данные не были подделаны третьей стороной или испорчены каким-то образом. Yii предоставляет способ проверить целостность данных по MAC подписи.

Ключ $key должен присутствовать как на отправляющей, так и на принимающей стороне. На отправляющей стороне:

php
$signedMessage = (new \Yiisoft\Security\Mac())->sign($message, $key);

sendMessage($signedMessage);

На принимающей стороне:

php
$signedMessage = receiveMessage($signedMessage);

try {
    $message = (new \Yiisoft\Security\Mac())->getMessage($signedMessage, $key);
} catch (\Yiisoft\Security\DataIsTamperedException $e) {
    // данные подделаны
}

Маскировка длины токена

Маскировка токена помогает смягчить атаку BREACH за счет рандомизации способа вывода токена при каждом запросе. К токену применяется случайная маска, делающая строку всегда уникальной.

Для маскировки токена:

php
$maskedToken = \Yiisoft\Security\TokenMask::apply($token);

Получить исходное значение из замаскированного:

php
$token = \Yiisoft\Security\TokenMask::remove($maskedToken);