Шифрование

Шифрование в Imhotep — это простой способ защитить ваши данные. Представьте, что вы отправляете письмо в запечатанном конверте: никто по пути не сможет прочитать его содержимое. Так же и здесь — шифрование превращает ваши данные в "закодированное сообщение", которое можно прочитать только с правильным ключом.

Система использует OpenSSL — надежный и проверенный стандарт шифрования. Каждое зашифрованное значение дополнительно защищается специальной "цифровой печатью" (MAC). Это гарантирует, что данные не были изменены или подделаны после шифрования — как пломба на конверте.

Конфигурирование

Прежде чем начать шифровать, нужно подготовить "ключ безопасности" — это как пароль к вашему сейфу. Все настройки хранятся в файле config/app.php, а конкретное значение ключа берется из переменной APP_KEY в файле .env.

Чтобы сгенерировать новый ключ, выполните в терминале:

php imhotep key:generate
SHELL

Важно: Ключ создается автоматически при установке Imhotep, так что в большинстве случаев вам даже не придется об этом думать. Но если вы переносите проект на другой сервер — не забудьте сгенерировать или перенести ключ, иначе старые данные не получится расшифровать.

Ротация ключей шифрования

В жизни любого приложения наступает момент, когда ключ шифрования нужно обновить. Это может быть плановая замена, требование безопасности или просто перенос проекта на новый сервер. Но есть одна проблема: стоит вам поменять ключ — и все данные, зашифрованные старым ключом, становятся "запечатанным сундуком без ключа". Сессии пользователей ломаются, зашифрованные cookie перестают читаться, и пользователи внезапно вылетают из системы.

Чтобы этого избежать, Imhotep поддерживает механизм плавного перехода между ключами. Вы указываете список предыдущих ключей в переменной окружения APP_PREVIOUS_KEYS, и система запоминает их как "запасные ключи" от старых сейфов:

APP_KEYS=base64:x+AAx2ATS1czwgSUH1cHuB7/bb9sZlRXQgrKsraknGE=
APP_PREVIOUS_KEYS=base64:V7f1quetlqSPoOx2ceBeYp1qEcGA9AEs9mCkMVCkLCY=
PHP

Это значит, что ваши пользователи даже не заметят смены ключа — их сессии останутся активными, старые данные продолжат читаться, а всё новое уже будет зашифровано новым ключом. Как только вы убедитесь, что старых данных, зашифрованных предыдущими ключами, больше нет (или они все перешифрованы), можно смело очистить список 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();
}
PHP

Расшифровка данных

Расшифровка — это обратный процесс. Вы берете зашифрованный "пакет", открываете его своим ключом и получаете исходные данные.

use Imhotep\Contracts\Encryption\DecryptException;

try {
    $encryptedValue = "eyJpdiI6IlVrS3..."; // То, что получили на предыдущем шаге
    
    $decrypted = Crypt::decryptString($encryptedValue);
    // или
    $decrypted = decryptString($encryptedValue);
    
    echo $decrypted; // "Мой секретный пароль"
} catch (DecryptException $e) {
    // Расшифровка не удалась — возможно, испорчен ключ или данные
    echo "Не могу расшифровать: " . $e->getMessage();
}
PHP

Шифрование сложных данных (массивов и объектов)

Если вам нужно зашифровать не просто текст, а структурированные данные (массивы, объекты), используйте метод encrypt:

try {
    $userData = [
        'id' => 1,
        'email' => 'user@example.com',
        'preferences' => ['theme' => 'dark']
    ];
    
    // Шифруем массив целиком
    $encrypted = Crypt::encrypt($userData);
    
    // Позже расшифровываем и получаем обратно массив
    $decrypted = Crypt::decrypt($encrypted);
} catch (Throwable $e) {
    // Если что-то пошло не так — покажем ошибку
}
PHP

Получение текущего ключа шифрования

Можно всегда посмотреть, какой ключ используется в данный момент:

$currentKey = Crypt::key();
PHP