9

tornado .web モジュールには、次の関数があります_time_independent_equals

def _time_independent_equals(a, b):
    if len(a) != len(b):
        return False
    result = 0
    for x, y in zip(a, b):
        result |= ord(x) ^ ord(y)
    return result == 0

これは、安全な Cookie 署名と名前を比較するために使用されます。

しかし、この関数の実装に関しては、複雑な言い方a==bですか?

4

1 に答える 1

18

この関数は単純に文字列を比較するのではなく、常に同じ時間をかけて実行しようとします。

これは、パスワードの比較などのセキュリティ タスクに役立ちます。関数が最初の不一致バイトで返された場合、攻撃者は考えられるすべての最初のバイトを試し、最も時間がかかったバイトが一致することを知ることができます。次に、考えられるすべての 2 番目のバイトを試して、最も時間がかかるバイトが一致することを確認できます。文字列全体が推定されるまで、これを繰り返すことができます。(実際には、ネットワークのランダムな遅延を克服するために多くの平均化を行う必要がありますが、辛抱強く待つとうまくいきます。)

于 2010-06-12T03:02:28.667 に答える