Skip to main content

Crypt Facade 是什麼

Laravel 的加密服務透過 OpenSSL 的 AES-256-CBC 加密(或 AES-128-CBC),以簡潔的介面提供值的加密與解密。 Laravel 加密的每個值皆會由**訊息驗證碼(MAC)**簽署。 若加密後的值遭到竄改,將無法被解密。

設定

產生 APP_KEY

使用加密前,需先設定 config/app.phpkey。 此值會從 APP_KEY 環境變數讀取。 請使用 php artisan key:generate 指令產生安全的金鑰。 它會透過 PHP 的安全隨機產生器產生密碼學上安全的金鑰。
Laravel 安裝時通常會自動產生。產生的金鑰會存到 .env
絕不可將 APP_KEY 對外公開。若金鑰洩漏,所有加密資料都可能被解密。

加密金鑰輪替

若變更加密金鑰,會使所有已認證使用者的 session 登出。 因為 Laravel 對包含 session cookie 在內的所有 cookie 都進行加密。 此外,用舊金鑰加密的資料將無法解密。 為緩解此問題,可以在 APP_PREVIOUS_KEYS 以逗號分隔列出舊金鑰。
Laravel 加密時永遠使用目前的金鑰,但解密時若目前金鑰失敗,會依序嘗試舊金鑰。 如此一來,即便金鑰輪替中,使用者仍可持續使用應用程式。

加密

使用 Crypt Facade 的 encryptString 方法加密值。 加密後的值採 OpenSSL 與 AES-256-CBC,並經由 MAC 簽署。
encryptString 加密字串時不會做序列化。若要加密物件或陣列,請改用 encrypt

解密

使用 Crypt Facade 的 decryptString 方法解密加密的值。 當 MAC 無效等,無法正常解密時會拋出 DecryptException

模型的 Cast

在 Eloquent 模型中使用 encrypted cast,就能自動加密 / 解密屬性。
一旦設定 cast,指派或取得屬性值時會自動加密 / 解密。
encrypted:* cast 內部使用 Crypt::encryptCrypt::decrypt。 資料庫欄位型別建議使用 textlongText

實用範例:個資的加密儲存

以下是將個資(身分證字號、信用卡號等)安全地存入資料庫的典型作法。

Migration

模型

控制器


總結

下一步

雜湊

學習密碼的安全雜湊化與驗證方式。

授權

說明使用 Policy 與 Gate 的存取控制。
最後修改於 2026年8月2日