2010-06-12 348 views
9

tornado名.web模塊有一個名爲_time_independent_equals功能:這是什麼`_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

回答

18

該函數不會簡單比較字符串,它會嘗試總是花費相同的時間量來執行。

這對比較密碼等安全任務很有用。如果該函數在第一個不匹配字節上返回,則攻擊者可以嘗試所有可能的第一個字節,並知道最長的字符是匹配項。然後他們可以嘗試所有可能的第二個字節,並知道最長的那個是匹配。這可以重複,直到整個字符串被推斷。 (在現實中,你必須做很多平均來克服網絡中的隨機延遲,但如果你耐心的話,它可以工作。)