Skip to content

Encryption (Mã hóa)

Giới thiệu (Introduction)

Dịch vụ encryption của Laravel cung cấp interface đơn giản để mã hóa và giải mã văn bản qua OpenSSL sử dụng AES-256AES-128 encryption. Tất cả giá trị được mã hóa đều ký bằng message authentication code (MAC) để ngăn chặn giả mạo.

Cấu hình (Configuration)

Trước khi sử dụng encrypter, bạn phải set key trong config/app.php. Giá trị này được điều khiển bởi biến môi trường APP_KEY.

bash
php artisan key:generate

Lệnh key:generate sử dụng PHP secure random bytes generator để tạo key an toàn mật mã.

Xoay Key (Gracefully Rotating Encryption Keys)

Khi thay đổi APP_KEY, giữ key cũ trong APP_PREVIOUS_KEYS:

env
APP_KEY="base64:J63qRTDLub5NuZvP+kb8YIorGS6qFYHKVo6u7179stY="
APP_PREVIOUS_KEYS="base64:2nLsGFGzyoae2gaNVcC8SickLIRhbgeNhvqo3CvyLmA="

Laravel sẽ tự động thử decrypt bằng key hiện tại trước, sau đó thử các keys cũ. Ngoài ra dùng lệnh encrypt Artisan để re-encrypt data bằng key mới:

bash
php artisan encrypt:graceful-rotation

Sử dụng Encrypter

Mã hóa (Encrypting a Value)

php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Crypt;

class DigitalOceanTokenController extends Controller
{
    public function store(Request $request): RedirectResponse
    {
        $request->user()->fill([
            'token' => Crypt::encryptString($request->token),
        ])->save();

        return redirect('/secrets');
    }
}

Mọi giá trị được mã hóa bằng OpenSSL AES-256-CBC cipher và ký bằng MAC.

Giải mã (Decrypting a Value)

php
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Support\Facades\Crypt;

try {
    $decrypted = Crypt::decryptString($encryptedValue);
} catch (DecryptException $e) {
    // Không thể giải mã (MAC không hợp lệ hoặc dữ liệu bị giả mạo)
    report($e);
}

LƯU Ý

Nếu MAC không hợp lệ (dữ liệu bị tampering), DecryptException sẽ được throw.