web-dev-qa-db-ja.com

セッションIDエントロピーがセッションIDの長さの半分しかないのはなぜですか?

OWASP Webサイトの このページ に、セッションIDエントロピーに関する文があります。

セッションID値は、少なくとも64ビットのエントロピーを提供する必要があります(適切なPRNGが使用されている場合、この値は、セッションの長さの半分であると推定されますID)。

私が理解しているのは、セッションIDが128個のランダムなビット(適切なPNRGによって与えられる)で構成されている場合、得られるものは64ビットのエントロピー

良いPNRGからランダムな128ビットを取得すると、128ビットのエントロピーに非常に近いものを期待できると思いました。私は何か間違ったことを理解しましたか?

4
anselant

このビット "if your session id is made of 128 random bits "は誤解です。

セッションIDが128ビット長である場合、それはnot 128ランダムビットです-おそらく約64ランダムビットであり、128ビット文字列としてエンコードされます。

セッションIDは数値ではありません。これは文字列の識別子であり、mightは数値を表す可能性があります。
セッションIDが16進数として構築され、文字列形式で表される場合、各ランダムバイトはセッションID文字列で2文字を占めます。これは、その「長さの半分」がその引用から来ているところです。
ただし、そのページの前のセクションに注意してください。他の実装(ASP.NETなど)があります。ランダムビットは文字列16進数で直接表現されず、代わりにbase-64でエンコードされます。サイズが1/3しか増加しない(またはビットの25%がランダムではない)。その場合、160ビットのセッションIDは実際にはランダムな120ビットを与えます。

TL; DR:セッションIDが128ビット長の場合、それらのすべてがランダムであるわけではありません。

3
AviD

セッションIDは耐衝突性である必要があります。つまり、ランダムIDを推測してセッションを盗もうとする人は、成功する可能性が低い必要があります。

この衝突抵抗は、セッションIDのエントロピーの平方根に比例します。これは 誕生日のパラドックス によるものです。攻撃者はanyセッションIDの場合、一致する可能性のあるIDの数よりもはるかに少ない推測で済みます。

128ビットのIDから64ビットの衝突耐性エントロピーを得る理由は、ビット単位で測定する場合、可能なIDの数の平方根をとることは、ビット数を2で除算することと同じであるためです。

0
Mark