Laravel 何気に便利かも知れない。パスワードをハッシュ化してくれる hashed cast
本題
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