LoginSignup
32

More than 3 years have passed since last update.

暗号化・復号を Laravel で行う

Last updated at Posted at 2019-12-11

基本

Laravel の暗号化は、 .env で設定された APP_KEY=base64:XXXXXX をシークレットとして使用します。暗号化時のこの値を忘れると復号できなくなるので注意してください。

シリアライズして任意の型を暗号化

use Illuminate\Support\Facades\Crypt;

$encrypted= Crypt::encrypt(['foo' => 'bar']);
dump($encrypted );
/*
Base64エンコードされた暗号化結果が出力される
*/

$decrypted = Crypt::decrypt($encrypted);
dump($decrypted);
/*
array:1 [
  "foo" => "bar"
]
*/
  • メリット: 任意の値を暗号化できる
  • デメリット: 他のアプリケーションとの相互運用性が低い(PHPにべっとり依存している)

シリアライズせずに文字列だけを暗号化

use Illuminate\Support\Facades\Crypt;

$encrypted= Crypt::encryptString('foo');
dump($encrypted);
/*
Base64エンコードされた暗号化結果が出力される
*/

$decrypted = Crypt::decryptString($encrypted);
dump($decrypted);
/*
"foo"
*/
  • メリット: 他のアプリケーションとの相互運用性が高い
  • デメリット: 型が文字列に限定される

応用

特定のモデルのフィールドを自動で暗号化・複合する

ユーザモデルの last_name フィールドを暗号化する例
public function getLastNameAttribute(): string
{
    return Crypt::decrypt($this->attributes['last_name']);
}

public function setLastNameAttribute(string $value): void
{
    $this->attributes['last_name'] = Crypt::encypt($value);
}
ユーザモデルの last_name フィールドを暗号化する例
nullを認める場合)
public function getLastNameAttribute(): ?string
{
    return isset($this->attributes['last_name'])
        ? Crypt::decrypt($this->attributes['last_name'])
        : null;
}

public function setLastNameAttribute(?string $value): void
{
    $this->attributes['last_name'] = $value !== null
        ? Crypt::encrypt($value)
        : null;
}

またメモすることがあれば追記します。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32