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が使われたりしているようです。
こちらにソースが置いてます。
コメント