Шифрование
Шифрование в Imhotep — это простой способ защитить ваши данные. Представьте, что вы отправляете письмо в запечатанном конверте: никто по пути не сможет прочитать его содержимое. Так же и здесь — шифрование превращает ваши данные в "закодированное сообщение", которое можно прочитать только с правильным ключом.
Система использует OpenSSL — надежный и проверенный стандарт шифрования. Каждое зашифрованное значение дополнительно защищается специальной "цифровой печатью" (MAC). Это гарантирует, что данные не были изменены или подделаны после шифрования — как пломба на конверте.
Конфигурирование
Прежде чем начать шифровать, нужно подготовить "ключ безопасности" — это как пароль к вашему сейфу. Все настройки хранятся в файле config/app.php, а конкретное значение ключа берется из переменной APP_KEY в файле .env.
Чтобы сгенерировать новый ключ, выполните в терминале:
php imhotep key:generate
Важно: Ключ создается автоматически при установке Imhotep, так что в большинстве случаев вам даже не придется об этом думать. Но если вы переносите проект на другой сервер — не забудьте сгенерировать или перенести ключ, иначе старые данные не получится расшифровать.
Ротация ключей шифрования
В жизни любого приложения наступает момент, когда ключ шифрования нужно обновить. Это может быть плановая замена, требование безопасности или просто перенос проекта на новый сервер. Но есть одна проблема: стоит вам поменять ключ — и все данные, зашифрованные старым ключом, становятся "запечатанным сундуком без ключа". Сессии пользователей ломаются, зашифрованные cookie перестают читаться, и пользователи внезапно вылетают из системы.
Чтобы этого избежать, Imhotep поддерживает механизм плавного перехода между ключами. Вы указываете список предыдущих ключей в переменной окружения APP_PREVIOUS_KEYS, и система запоминает их как "запасные ключи" от старых сейфов:
APP_KEYS=base64:x+AAx2ATS1czwgSUH1cHuB7/bb9sZlRXQgrKsraknGE=
APP_PREVIOUS_KEYS=base64:V7f1quetlqSPoOx2ceBeYp1qEcGA9AEs9mCkMVCkLCY=
Это значит, что ваши пользователи даже не заметят смены ключа — их сессии останутся активными, старые данные продолжат читаться, а всё новое уже будет зашифровано новым ключом. Как только вы убедитесь, что старых данных, зашифрованных предыдущими ключами, больше нет (или они все перешифрованы), можно смело очистить список APP_PREVIOUS_KEYS и оставить только актуальный ключ.
Шифрование данных
Шифрование — это как упаковка ценной вещи в сейф. Вы кладете туда информацию, закрываете на ключ, и получаете зашифрованный "пакет".
Используйте фасад Crypt или глобальную функцию encryptString:
use Imhotep\Contracts\Encryption\EncryptException;
try {
// Зашифровать обычный текст
$secretCode = Crypt::encryptString("Мой секретный пароль");
// Или так (более короткий вариант)
$secretCode = encryptString("Мой секретный пароль");
echo $secretCode; // Что-то вроде "eyJpdiI6IlVrS3..."
} catch (EncryptException $e) {
// Если что-то пошло не так — покажем ошибку
echo "Не удалось зашифровать данные: " . $e->getMessage();
}
Расшифровка данных
Расшифровка — это обратный процесс. Вы берете зашифрованный "пакет", открываете его своим ключом и получаете исходные данные.
use Imhotep\Contracts\Encryption\DecryptException;
try {
$encryptedValue = "eyJpdiI6IlVrS3..."; // То, что получили на предыдущем шаге
$decrypted = Crypt::decryptString($encryptedValue);
// или
$decrypted = decryptString($encryptedValue);
echo $decrypted; // "Мой секретный пароль"
} catch (DecryptException $e) {
// Расшифровка не удалась — возможно, испорчен ключ или данные
echo "Не могу расшифровать: " . $e->getMessage();
}
Шифрование сложных данных (массивов и объектов)
Если вам нужно зашифровать не просто текст, а структурированные данные (массивы, объекты), используйте метод encrypt:
try {
$userData = [
'id' => 1,
'email' => 'user@example.com',
'preferences' => ['theme' => 'dark']
];
// Шифруем массив целиком
$encrypted = Crypt::encrypt($userData);
// Позже расшифровываем и получаем обратно массив
$decrypted = Crypt::decrypt($encrypted);
} catch (Throwable $e) {
// Если что-то пошло не так — покажем ошибку
}
Получение текущего ключа шифрования
Можно всегда посмотреть, какой ключ используется в данный момент:
$currentKey = Crypt::key();