php-トークンのランダムデータをハッシュするとセキュリティが向上しますか?
ランダムソルトとパスワードハッシュを生成するためにphpassを使用していますが、私の質問は、パスワードのリセットなど、一意のトークンを作成することです。基本的に、16バイトのランダムデータを取得し、それをsha256ハッシュに渡します。これは良い習慣ですか、それとも16バイトのデータを使用することに固執する必要がありますか
private static function get_random_bytes($count) {
$output = '';
if (is_readable('/dev/urandom') &&
($fh = @fopen('/dev/urandom', 'rb'))) {
$output = fread($fh, $count);
fclose($fh);
}
$random_state = microtime();
if (function_exists('getmypid'))
$random_state .= getmypid();
if (strlen($output) < $count) {
$output = '';
for ($i = 0; $i < $count; $i += 16) {
$random_state =
md5(microtime() . $random_state);
$output .=
pack('H*', md5($random_state));
}
$output = substr($output, 0, $count);
}
return $output;
}
答え :
解決策:
ランダムデータが暗号的に強力である場合は、それをハッシュする必要はありません。
rand()
で取得した値など、データが暗号に強いものでない場合、ハッシュの方が少し安全かもしれませんが、メリットは最小限であり、実際にはより強力なPRNG。
この場合、考えられる唯一のセキュリティ上の欠陥は、誰かがいる場合です
- SQLインジェクションを使用して、データベースからすべてのパスワードとソルトをプルしました。
- 塩の生成にパターンが見つかりました
- 予測された塩に基づいてレインボーテーブルを作成しました
- データベースからデータを再度取得します。
- レインボーテーブルを使用して、データベースから多数のパスワードを解読します。
つまり、基本的に、セキュリティは追加されません。さらに、上記のコードは/ dev / urandomを使用します。これは非常に強力なランダム性を提供するため、上記の手順2は多かれ少なかれ不可能であるため、メリットはさらに減少します。その激しい攻撃を受けている唯一の組織は、NSA、CIA、および同様のグループです。
答え :
解決策:
はい、パスワードリセットトークンのランダムデータをハッシュすると、セキュリティが完全に向上します。
ハッシュされていないトークンがアカウントの侵害に役立つ可能性があるシナリオ:
攻撃者
- データベースへの読み取りアクセスを取得します
- トークンがパスワードリセットトークンテーブルに表示されるのを待ちます
<g>
、 -
トークン、関連するメールアドレス、クラフトURLを取得します
http://example.com/password_reset?t=gobble-dee-goo-token
関連付けられたメールアドレスのパスワードを変更できるようになりました。
phpassハッシュを介して、攻撃者がDBへの読み取りアクセスを取得した場合でも、パスワードリセット機能を使用してアカウントを侵害することはできません。これは、トークンのハッシュを使用してURLを作成できないためです。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。