ماذا يعني هذا "_الوقت_المستقل_يساوي"؟
سؤال
في ال إعصاروحدة .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
?
المحلول
لا تقوم هذه الوظيفة بمقارنة السلاسل فحسب، بل تحاول دائمًا أن تستغرق نفس القدر من الوقت للتنفيذ.
وهذا مفيد لمهام الأمان مثل مقارنة كلمات المرور.إذا تم إرجاع الدالة على البايت الأول غير المتطابق، فيمكن للمهاجم تجربة جميع البايتات الأولى الممكنة ومعرفة أن البايت الذي يستغرق وقتًا أطول هو التطابق.ومن ثم يمكنهم تجربة كل البايتات الثانية الممكنة ومعرفة أن البايت الذي يستغرق وقتًا أطول هو التطابق.ويمكن تكرار ذلك حتى يتم استنتاج السلسلة بأكملها.(في الواقع، يتعين عليك القيام بالكثير من عمليات المتوسط للتغلب على التأخير العشوائي في الشبكة، ولكنه سينجح إذا تحليت بالصبر.)