セッションハッシュサイズは重要ですか?
質問
セッションハッシュに使用する適切なアルゴリズムを選択するときにサイズは重要です。
私は最近これを読みました 記事 そして、Whirlpoolを使用してセッションIDのハッシュを作成することを提案しました。 Whirlpoolは128文字のハッシュストリングを生成します、これは大きすぎますか?
計画は、セッションハッシュをDBに保存することです。 64文字フィールド(SHA256)、96文字フィールド(SHA384)、または128文字フィールド(Whirlpool)を使用することには大きな違いはありますか? Whirlpoolで行われた最初の議論の1つは、Speed vs他のアルゴリズムでしたが、Sha384の速度を見ると、あまり悪くはありません。
ハッシュを切り捨てて128文字より小さくするオプションがあります。
ニーズに基づいたアルゴリズムの変更を可能にするために、元のコードスニペットを変更しました。
アップデート: :文字列がハッシュされていることについていくつかの議論があったので、コードを含めました。
function generateUniqueId($maxLength = null) {
$entropy = '';
// try ssl first
if (function_exists('openssl_random_pseudo_bytes')) {
$entropy = openssl_random_pseudo_bytes(64, $strong);
// skip ssl since it wasn't using the strong algo
if($strong !== true) {
$entropy = '';
}
}
// add some basic mt_rand/uniqid combo
$entropy .= uniqid(mt_rand(), true);
// try to read from the windows RNG
if (class_exists('COM')) {
try {
$com = new COM('CAPICOM.Utilities.1');
$entropy .= base64_decode($com->GetRandom(64, 0));
} catch (Exception $ex) {
}
}
// try to read from the unix RNG
if (is_readable('/dev/urandom')) {
$h = fopen('/dev/urandom', 'rb');
$entropy .= fread($h, 64);
fclose($h);
}
// create hash
$hash = hash('whirlpool', $entropy);
// truncate hash if max length imposed
if ($maxLength) {
return substr($hash, 0, $maxLength);
}
return $hash;
}
解決
ハッシュを作成するのにかかる時間は重要ではありません。データベースが適切にインデックス化されている限り、ストレージ方法も主要な要因ではありません。
ただし、ハッシュは、クッキーとして頻繁に、クライアントの要求を毎回送信する必要があります。大型クッキーは、各リクエストに少量の追加時間を追加できます。見る Yahoo!のページパフォーマンスのベストプラクティス 詳細については。より小さなクッキー、したがって、より小さなハッシュには利点があります。
全体として、大きなハッシュ関数はおそらく正当化されません。限られた範囲の場合、古き良きMD5とSHA1は、セッショントークンの背後にあるソースとしておそらく問題ありません。
他のヒント
はい、サイズが重要です。
短すぎると、衝突のリスクがあります。また、攻撃者がブルートフォース攻撃によって他の誰かのセッションを見つけることを実用的にします。
長すぎることはそれほど重要ではありませんが、セッションIDのすべてのバイトをリクエストごとにブラウザからサーバーに転送する必要があるため、実際に最適化する場合は、長すぎるIDが必要ない場合があります。
ただし、ハッシュアルゴリズムのすべてのビットを使用する必要はありませんが、Whirlpoolのようなものを使用することを妨げるものは何もありません。最初の128ビット(ヘックスで32文字)しか使用しません。実際に言えば、128ビットも長さが良い下限です。
しかし、エリクソンが指摘しているように、ハッシュを使用するのは少し奇妙です。使用しているIDの長さと同じくらいの入力と同じくらいのエントロピーがない限り、ハッシュへの入力を推測する攻撃に対して脆弱です。
この記事はそれを読み込もうとするときに時を挙げていますが、ハッシュをセッション識別子として使用する正当な理由は考えられません。セッション識別子は予測不可能である必要があります。記事のタイトルを考えると、著者はその原則を認めているように聞こえます。次に、暗号化乱数ジェネレーターを使用してセッション識別子を生成してみませんか?
ハッシュは入力を受け取り、その入力が予測可能である場合、ハッシュも同様であり、それは悪いことです。
SHA1またはMD5は、おそらくお客様のニーズに十分です。実際には、衝突の可能性は非常に少ないため、決して起こらない可能性があります。
ただし、最終的には、必要なレベルのセキュリティに依存します。また、より長いハッシュは、計算するのがより高価であり、より多くのストレージスペースが必要であることに留意してください。