PHPのpassword_hash(),password_verify()を使った場合に別の言語などに移行しても大丈夫?→大丈夫だった。

いつもよく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。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です