🔐

Laravel 何気に便利かも知れない。パスワードをハッシュ化してくれる hashed cast

2023/05/12に公開

本題

Laravel 10.10 にて hashed という cast タイプが追加されました。
[10.x] Add 'hashed' cast #46947

これは、今までパスワードを保存する際に手動でハッシュ化していた作業を自動で行ってくれる機能ですね。

つまりこのキャスト機能を使って、

$user->password = 'hogebar';
$user->save();

とやれば、後は Laravel が保存前にハッシュ化した上で保存してくれるという事です。

なかなか便利そうですが、1つ出てくる懸念点としては、ライブラリとかを使用していると、そのライブラリとかはハッシュ化した上で保存するだろうから、2重でハッシュ化されてしまうのでは?という点がありましたが、意外とそこまで考慮して作ってありました。

つまり、

$user->password = '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi';
$user->save();

のようにしても、既にハッシュ化済みと見なされる時は、再度ハッシュ化はしないで、そのまま保存してくれるという事です。

とは言え、初期版には一部問題も

リリースほやほやの Ver. 10.10.0 では、一部問題もありました。上記のハッシュ化された文字列を渡された際、状況によっては、再ハッシュ化(2重でハッシュ化)してしまうという問題です。
Newly added 'hashed' cast may be incorrect. #47028

これは、Ver. 10.10.1 で修正されています。
[10.x] 'hashed' cast - do not rehash already hashed value #47029

ですので、もし気が早く Ver. 10.10.0 で既にこの機能をオンにされた方は、バージョンアップをお勧めします。(一応、バグ報告しておいたのは私だったりしますが…)

重箱の隅を突く制限事項

ほぼ気にしなくていいレベルではありますが、最近、役所システムのバグなどがIT業界を賑わしているので…。

上記で書いたように既にハッシュ化されていると見なされた時は、ハッシュ化はされません。ですが、逆にそういうパスワードを付けようとしているのに、ハッシュ化されていると見なされた時は、ハッシュ化してくれません。

とは言え、流石に $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi みたいなパスワードを付けようとする人はいないでしょうね。

ただ、$argon2i$abcd みたいなパスワードでも既にハッシュ化されていると見なされます。頭が $argon2i$ から始まっている場合ですね。まぁ、パスワードを $argon2i$ から始める人とか、これまた普通はいないでしょ、って話ではありますけど。(暗号好きの人なら、もしかして?)

Laravel スケルトンの Models/User.php もこれを実装へ

執筆時点において、app/Models/User.php がこの hashed キャスト機能を利用し始めました。
Add hashed cast to user password #6171

次回、Laravel をインストールした際は、これがデフォルトで付いてくる感じですね。

雑感

まぁ、Laravel Breeze とか使っていると、あまりこの辺気にしないかもですね。
Laravel Breeze と言えば、日本語化してくれる breezejp が便利です。

間違い等ありましたらコメント下さい。

Discussion