[Laravel]クエリパラメータを暗号化・復号化(encrypt, decrypt)

Laravel Laravel

laravelのencryptヘルパを使って、画面遷移時のパラメータの暗号化をしたので
laravelでの値の暗号化・復号化方法を記載しています。

下記を参考にしています。
(公式翻訳)Laravel 7.x 暗号化
公式Encryption Laravel7.x

暗号化する前に準備

下記コマンドを実行して、キーを作成します。

php artisan key:generate

.envのAPP_KEYにキーが追加されます。
このキーを作っておかないと、安全に暗号化されないようです。

Cryptファサードを使う

暗号化(encrypt)

Crypt::encryptに暗号化したい値を渡します。
変数でも配列でもクラスインスタンスでもOKです。

戻り値は暗号化した時のキーになります。
下記は配列を暗号化しました。

>>> Crypt::encrypt(["user" => ["name" => "hoge", "age" => 30]]);

=> "eyJpdiI6ImFtejNx --- 省略 ---"

復号化(decrypt)

Crypt::decryptに暗号化時のキーを渡すと、変換された値が返ってきます。

上記で暗号化したものを復号化しました。

>>> Crypt::decrypt("eyJpdiI6ImFtejNx  --- 省略 ---");

=> [
     "user" => [
       "name" => "hoge",
       "age" => 30,
     ],
   ]

encryptヘルパーを使う

暗号化(encrypt)

ファサードと同じように使って暗号化が可能です。

クラスを暗号化してみます。

class Fruit { public $name; public $color; }
$fruit = new Fruit();

$fruit->name = "banana";
$fruit->color = "yellow";

encryptを呼んで引数に渡すと…
復号化キーが返ってきます。

>>> encrypt($fruit);

=> "eyJpdiI6Inl2STh4bEx --- 省略 ---"

復号化(decrypt)

ファサードと同じように使って復号化が可能です。

>>> decrypt("eyJpdiI6Inl2STh4bEx --- 省略 ---");

=> Fruit {#4159
     +name: "banana",
     +color: "yellow",
   }

getのurlパラメータ暗号化

laravelのgetルーティングしてある箇所で、パラメータを暗号化することがありました..
やり方としてはコントローラーで、パラメーターを暗号化してbladeに渡します。

public function index()
{
    $param = [
        'id'    => 1,
        'fruit' => 'apple',
    ];

    return view('test_route', ['param' => encrypt($param)]);
}

aリンクなどパラメータをそのまま付けてあげて

<a href="{{'http://127.0.0.1:8000/test/next_screen?param='.$param}}}">test</a>

次の画面のコントローラーでdecryptすれば使えます。

public function nextScreen(Request $request)
{
    $decryptParam = decrypt($request->param);
    dd($decryptParam);
}

nextScreenにアクセスすると、値が復号化されているのが確認できました。

array:2 [▼
  "id" => 1
  "fruit" => "apple"
]

おわりに

どんな感じで暗号化・復号化されているのか気になったので、ソースを見てみました。
ぱっと見だと、読み解けませんでした…😂
openssl_encrypt, openssl_decryptが使われたりしているようです。

こちらにソースが置いてます。

コメント

タイトルとURLをコピーしました