سؤال

في ال إعصاروحدة .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

يتم استخدامه لمقارنة توقيعات ملفات تعريف الارتباط الآمنة، وبالتالي الاسم.

ولكن فيما يتعلق بتنفيذ هذه الوظيفة، هل هي مجرد طريقة معقدة للقول a==b?

هل كانت مفيدة؟

المحلول

لا تقوم هذه الوظيفة بمقارنة السلاسل فحسب، بل تحاول دائمًا أن تستغرق نفس القدر من الوقت للتنفيذ.

وهذا مفيد لمهام الأمان مثل مقارنة كلمات المرور.إذا تم إرجاع الدالة على البايت الأول غير المتطابق، فيمكن للمهاجم تجربة جميع البايتات الأولى الممكنة ومعرفة أن البايت الذي يستغرق وقتًا أطول هو التطابق.ومن ثم يمكنهم تجربة كل البايتات الثانية الممكنة ومعرفة أن البايت الذي يستغرق وقتًا أطول هو التطابق.ويمكن تكرار ذلك حتى يتم استنتاج السلسلة بأكملها.(في الواقع، يتعين عليك القيام بالكثير من عمليات المتوسط ​​للتغلب على التأخير العشوائي في الشبكة، ولكنه سينجح إذا تحليت بالصبر.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top