Шифрування

Вступ

Сервіси шифрування Laravel надають простий та зручний інтерфейс для шифрування та дешифрування тексту за допомогою OpenSSL з використанням шифрування AES-256 та AES-128. Усі зашифровані значення Laravel підписуються за допомогою коду автентифікації повідомлення (MAC), щоб їхнє базове значення не могло бути змінено або підроблено після шифрування.

Конфігурація

Перш ніж використовувати шифрувальник Laravel, ви повинні встановити параметр конфігурації key у вашому конфігураційному файлі config/app.php. Це значення конфігурації керується змінною середовища APP_KEY. Ви повинні використовувати команду php artisan key:generate для генерації значення цієї змінної, оскільки команда key:generate використовуватиме безпечний генератор випадкових байтів PHP для створення криптографічно безпечного ключа для вашого застосунку. Зазвичай значення змінної середовища APP_KEY буде згенеровано для вас під час встановлення Laravel.

Акуратна ротація ключів шифрування

Якщо ви зміните ключ шифрування вашого застосунку, всі автентифіковані сесії користувачів будуть вийдені з вашого застосунку. Це відбувається тому, що кожен cookie, включаючи сесійні cookie, зашифрований за допомогою Laravel. Крім того, більше не буде можливості розшифрувати будь-які дані, які були зашифровані з вашим попереднім ключем шифрування.

Щоб пом'якшити цю проблему, Laravel дозволяє вам перерахувати ваші попередні ключі шифрування в змінній середовища вашого застосунку APP_PREVIOUS_KEYS. Ця змінна може містити список усіх ваших попередніх ключів шифрування, розділених комами:

APP_KEY="base64:J63qRTDLub5NuZvP+kb8YIorGS6qFYHKVo6u7179stY="
APP_PREVIOUS_KEYS="base64:2nLsGFGzyoae2ax3EF2Lyq/hH6QghBGLIq5uL+Gp8/w="

When you set this environment variable, Laravel will always use the "current" encryption key when encrypting values. However, when decrypting values, Laravel will first try the current key, and if decryption fails using the current key, Laravel will try all previous keys until one of the keys is able to decrypt the value.

Цей підхід до плавного розшифрування дозволяє користувачам продовжувати використовувати ваш застосунок безперервно, навіть якщо ваш ключ шифрування змінено.

Використання Encrypter

Шифрування значення

Ви можете зашифрувати значення, використовуючи метод encryptString, наданий фасадом Crypt. Усі зашифровані значення шифруються за допомогою OpenSSL і шифру AES-256-CBC. Крім того, усі зашифровані значення підписуються кодом автентифікації повідомлення (MAC). Інтегрований код автентифікації повідомлення запобігатиме розшифровці будь-яких значень, які були змінені зловмисними користувачами:

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Crypt;
 
class DigitalOceanTokenController extends Controller
{
/**
* Зберегти токен API DigitalOcean для користувача.
*/
public function store(Request $request): RedirectResponse
{
$request->user()->fill([
'token' => Crypt::encryptString($request->token),
])->save();
 
return redirect('/secrets');
}
}

Розшифрування Значення

Ви можете розшифрувати значення, використовуючи метод decryptString, наданий фасадом Crypt. Якщо значення не може бути правильно розшифроване, наприклад, коли код автентифікації повідомлення є недійсним, буде викинуто Illuminate\Contracts\Encryption\DecryptException:

use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Support\Facades\Crypt;
 
try {
    $decrypted = Crypt::decryptString($encryptedValue);
} catch (DecryptException $e) {
    // ...
}