ホームページ > バックエンド開発 > Python チュートリアル > Python 3.3 のハッシュ値がセッション間で異なるのはなぜですか?

Python 3.3 のハッシュ値がセッション間で異なるのはなぜですか?

Barbara Streisand
リリース: 2024-11-02 22:56:29
オリジナル
232 人が閲覧しました

Why Do Python 3.3 Hash Values Differ Between Sessions?

Python 3.3 のハッシュ関数: セッション間で異なる結果が返される理由

Python 3.3 では、内部 hash() 関数が予期せぬ動作をします。異なるセッションで同じ文字列に対して異なるハッシュ値を返す。この現象は、Python がセキュリティ対策としてランダム ハッシュ シードを使用していることに起因します。

ランダム ハッシュ シードは、攻撃者がタールピット攻撃を引き起こす可能性のある予測可能なキーを悪用するのを防ぐために使用されます。ハッシュにランダムなオフセットを追加することで、攻撃者はどのキーが衝突するかを予測できなくなります。

ハッシュ関数の動作を制御するには、PYTHONHASHSEED 環境変数を設定できます。固定の正のシードを指定するとランダム性を抑制できますが、これを 0 に設定するとシード オフセットが完全に無効になります。

Python 3.3 より前では、ランダム ハッシュ シードは無効でした。ただし、デフォルトで有効になりました。この変更は、セットだけでなく、Python バージョン 3.5 以前の辞書にも影響します。

さらに、object.__hash__() には特別な動作があります。

  • str、bytes、および datetime の場合オブジェクトのハッシュ値は予測不可能な値で「ソルト」され、プロセス内では一貫性がありますが、セッション間では予測不可能になります。
  • この対策により、最悪の場合の辞書挿入を悪用したサービス拒否攻撃が防止されます。

ハッシュ値は、辞書やセットなどのマッピングの反復順序に影響を与えることに注意することが重要です。ただし、そのような順序は Python によって保証されず、ビルドやバージョンによって異なる場合があります。

一貫したハッシュを行うには、暗号化ハッシュ関数を提供する hashlib モジュールの使用を検討してください。さらに、pybloom は安定性のためにこのアプローチを利用しています。

ランダムなハッシュ シード オフセットにより、攻撃者がオフセットを決定することが困難になりますが、オフセット自体の保存も妨げられます。ただし、これにより、攻撃者はシードを決定するためにタイミング攻撃を使用できなくなります。

以上がPython 3.3 のハッシュ値がセッション間で異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート