암호화
소개
라라벨의 암호화 서비스는 AES-256 및 AES-128 암호화를 사용하여 OpenSSL을 통해 텍스트를 암호화하고 해독하기 위한 간단하고 편리한 인터페이스를 제공합니다. 라라벨의 모든 암호화된 값은 메시지 인증 코드(MAC)를 사용하여 서명되므로 암호화된 후 기본 값을 수정하거나 변조할 수 없습니다.
구성
라라벨의 암호화기를 사용하기 전에 config/app.php 구성 파일에서 key 구성 옵션을 설정해야 합니다. 이 구성 값은 APP_KEY 환경 변수에 의해 구동됩니다. key:generate 명령은 PHP의 보안 무작위 바이트 생성기를 사용하여 애플리케이션을 위한 암호화적으로 안전한 키를 생성하므로 이 변수의 값을 생성하려면 php artisan key:generate 명령을 사용해야 합니다. 일반적으로 APP_KEY 환경 변수의 값은 라라벨 설치 중에 자동으로 생성됩니다.
암호화 키를 안전하게 순환시키기
애플리케이션의 암호화 키를 변경하면 인증된 모든 사용자 세션이 애플리케이션에서 로그아웃됩니다. 이는 세션 쿠키를 포함한 모든 쿠키가 라라벨에 의해 암호화되기 때문입니다. 또한 이전 암호화 키로 암호화된 데이터를 더 이상 해독할 수 없게 됩니다.
이 문제를 완화하기 위해 라라벨에서는 애플리케이션의 APP_PREVIOUS_KEYS 환경 변수에 이전 암호화 키를 나열할 수 있습니다. 이 변수에는 이전 암호화 키가 쉼표로 구분된 목록으로 포함될 수 있습니다.
APP_KEY="base64:J63qRTDLub5NuZvP+kb8YIorGS6qFYHKVo6u7179stY="APP_PREVIOUS_KEYS="base64:2nLsGFGzyoae2ax3EF2Lyq/hH6QghBGLIq5uL+Gp8/w="
이 환경 변수를 설정하면 Laravel은 값을 암호화할 때 항상 "현재" 암호화 키를 사용합니다. 그러나 값을 해독할 때 Laravel은 먼저 현재 키를 시도하고, 현재 키를 사용하여 해독에 실패하면 값 해독이 가능한 키 중 하나가 나올 때까지 이전의 모든 키를 시도합니다.
이러한 원활한 해독 방식은 암호화 키가 변경되더라도 사용자가 애플리케이션을 중단 없이 계속 사용할 수 있게 해줍니다.
Encrypter 사용하기
값 암호화하기
Crypt 파사드에서 제공하는 encryptString 메서드를 사용하여 값을 암호화할 수 있습니다. 모든 암호화된 값은 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{ /** * 사용자를 위한 DigitalOcean API 토큰 저장하기 */ public function store(Request $request): RedirectResponse { $request->user()->fill([ 'token' => Crypt::encryptString($request->token), ])->save(); return redirect('/secrets'); }}
값 해독하기
Crypt 파사드에서 제공하는 decryptString 메서드를 사용하여 값을 해독할 수 있습니다. 메시지 인증 코드가 유효하지 않은 경우와 같이 값을 올바르게 해독할 수 없는 경우 Illuminate\Contracts\Encryption\DecryptException이 발생합니다.
use Illuminate\Contracts\Encryption\DecryptException;use Illuminate\Support\Facades\Crypt; try { $decrypted = Crypt::decryptString($encryptedValue);} catch (DecryptException $e) { // ...}