什麼是時序攻擊?
在密碼學中,時序攻擊是一種側信道攻擊,攻擊者試圖通過分析加密算法的時間執行來推導出密碼。每一個邏輯運算在計算機需要時間來執行,根據輸入不同,精確測量執行時間,根據執行時間反推出密碼。
$expected = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$correct = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$incorrect = crypt('apple', '$2a$07$usesomesillystringforsalt$');
var_dump(hash_equals($expected, $correct));
var_dump(hash_equals($expected, $incorrect));
進行比較,那麼兩個字符串是從第一位開始逐一進行比較的,發現不同就立即返回 false,那麼通過計算返回的速度就知道了大概是哪一位開始不同的,這樣就實現了電影中經常出現的按位破解密碼的場景。而使用 hash_equals 比較兩個字符串,無論字符串是否相等,函數的時間消耗是恆定的,這樣可以有效的防止時序攻擊。