Криптография
В этом разделе мы рассмотрим следующие аспекты безопасности:
- Генерация случайных данных
- Шифрование и расшифровка
- Проверка целостности данных
Для использования этих функций, вам нужно установить пакет yiisoft/security:
composer install yiisoft/securityГенерация псевдослучайных данных
Псевдослучайные данные используются во многих ситуациях. Например, при изменении пароля по email, вам необходимо сгенерировать токен, сохранить его в базу данных и отправить по email пользователю, чтобы он с помощью него подтвердил владение аккаунтом. Важно, чтобы этот токен был уникальным и его было трудно угадать, иначе есть вероятность, что атакующий может предсказать значение токена и сбросить пароль пользователя.
Класс \Yiisoft\Security\Random делает генерацию псевдослучайных данных простой:
$key = \Yiisoft\Security\Random::string(42);Код выше даст вам случайную строку, включающую 42 символа.
Если вам нужны байты или целые числа, напрямую используйте функции PHP:
random_bytes()для генерации байт. Обратите внимание, что вывод может быть не ASCII.random_int()для генерации целых чисел.
Шифрование и расшифровка
Yii предоставляет удобные вспомогательные функции для шифрования/расшифровки данных с помощью секретного ключа. Данные проходят через функцию шифрования таким образом, что только тот, кто знает секретный ключ, может расшифровать их. Например, вам нужно сохранить некоторую информацию в вашей базе данных, но вы должны быть уверены, что только пользователь, который знает секретный ключ, сможет расшифровать их (даже если кто-нибудь скомпрометирует базу данных приложения):
$encryptedData = (new \Yiisoft\Security\Crypt())->encryptByPassword($data, $password);
// сохранение данных в базу данных или другое хранилище
saveData($encryptedData);Расшифровка:
// получение зашифрованных данных из базы данных или другого хранилища
$encryptedData = getEncryptedData();
$data = (new \Yiisoft\Security\Crypt())->decryptByPassword($encryptedData, $password);Вы можете использовать ключ вместо пароля:
$encryptedData = (new \Yiisoft\Security\Crypt())->encryptByKey($data, $key);
// сохранение данных в базу данных или другое хранилище
saveData($encryptedData);Расшифровка:
// получение зашифрованных данных из базы данных или другого хранилища
$encryptedData = getEncryptedData();
$data = (new \Yiisoft\Security\Crypt())->decryptByKey($encryptedData, $key);Проверка целостности данных
Бывают ситуации, когда вам необходимо убедиться, что ваши данные не были подделаны третьей стороной или испорчены каким-то образом. Yii предоставляет способ проверить целостность данных по MAC подписи.
Ключ $key должен присутствовать как на отправляющей, так и на принимающей стороне. На отправляющей стороне:
$signedMessage = (new \Yiisoft\Security\Mac())->sign($message, $key);
sendMessage($signedMessage);На принимающей стороне:
$signedMessage = receiveMessage($signedMessage);
try {
$message = (new \Yiisoft\Security\Mac())->getMessage($signedMessage, $key);
} catch (\Yiisoft\Security\DataIsTamperedException $e) {
// данные подделаны
}Маскировка длины токена
Маскировка токена помогает смягчить атаку BREACH за счет рандомизации способа вывода токена при каждом запросе. К токену применяется случайная маска, делающая строку всегда уникальной.
Для маскировки токена:
$maskedToken = \Yiisoft\Security\TokenMask::apply($token);Получить исходное значение из замаскированного:
$token = \Yiisoft\Security\TokenMask::remove($maskedToken);