いつもよくCakePHPをフレームワークで使っていて、saltなどがなかったので、Laravelのフレームワークのパスワードハッシュ方法について調べてみました。(salt,seedとかいらない?と考え)
結果としては password_hash()で自動生成したものを利用していてsalt不要
→ほかの言語でも大丈夫 →ハッシュしたものに含まれるので大丈夫
でした、以下調べたこと。
ハッシュの方法
/vendor/laravel/framework/src/Illuminate/Contracts/Hashing/BcryptHasher.php
で、以下のようにハッシュしている
$hash = password_hash($value, PASSWORD_BCRYPT, [
'cost' => $this->cost($options),
]);
$valueがパスワードで、PASSWORD_BCRYPT がアルゴリズム(BCrypt)、オプションの’cost’は、BCryptの元Blowfish暗号化に用いるCost、BcryptHasher.phpでデフォルト10(2の10乗回ストレッチ)に設定されている。
BCrypt
sha,md5などが高速化されているのに対し、計算量が多く時間がかる、オフラインでのGPUなどを使った、アタック時のレインボーテーブル生成などに時間がかかる。
またパスワードごとにsaltが違うので、その分レインボーテーブルを作るのに時間がかかる。
ハッシュ化されたパスワードについて
60文字になる。なにか有事に備えDBの桁数などは多めにしておくと良いかも。
$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
暗号化バージョン : 2y
コスト : 10
ソルト : ‘N9qo8uLOickgx2ZMRZoMye’ (コストの後22文字)
暗号本体 : IjZAgcfl7p92ldGxad68LJZdL17lhWy
で、別の言語に移したらどうなるか?
phpを通してbcryptのルールでハッシュしているので、
Laravel事態がロジックをもたないので、他の言語でも認証OK。