Python 3.3 ハッシュ関数の不一致: セキュリティ メカニズムの解明
Python 3.3 では、hash() 関数がさまざまな結果を返すことが観察されています。異なるセッションにわたる同じ文字列に対して。この一見謎めいた動作は、サービス拒否攻撃を阻止するために実装された意図的なセキュリティ メカニズムに根ざしています。
このメカニズムを理解するには、Python が起動時に設定されるランダム ハッシュ シードを利用していることを認識することが不可欠です。このオフセットをハッシュ計算に組み込むことにより、攻撃者は特に衝突を引き起こすことを目的としたキーを設計する能力を奪われます。
例として、文字列 "235" のハッシュ値を考えてみましょう:
>>> hash("235") -310569535015251310
新しい Python コンソールを開始すると、ハッシュ値が変更されます。
>>> hash("235") -1900164331622581997
この変動性は、辞書挿入の最悪の場合のパフォーマンスを悪用する攻撃者に対する保護手段として機能し、O(n^ 2)複雑さ。その結果、攻撃者はどのキーが衝突してサービス妨害を誘発するかを予測できません。
ただし、オフセットが単純な加算や減算を伴うものではないことは注目に値します。これはプレフィックスとサフィックスで構成されており、どちらも予測不可能で常に変化します。これにより、オフセットの保存と利用が複雑になります。
あるいは、より安定したハッシュ メカニズムを必要とするアプリケーションの場合は、堅牢な暗号化ハッシュ関数を提供する hashlib モジュールを検討することもできます。これは、その信頼性のため、pybloom プロジェクトで推奨される選択肢です。
以上がPython 3.3 の「hash()」関数が同じ文字列に対して異なる結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。