硬體安全
下列關於上述密碼比對函式中潛藏的問題與對策的組合,何者正確?
int check(const char *in, const char *pw, int n) {
for (int i = 0; i < n; i++)
if (in[i] != pw[i]) return 0;
return 1;
}
- An很大時運算結果會出錯。比對之前先將n縮小
- B遇到第一個不一致就結束,因此可從處理時間得知前幾個字元是正確的。即使有不一致也比對到最後,再彙整結果後回傳
- C沒有問題,維持現狀即安全
查看答案與解析
正確答案:B. 遇到第一個不一致就結束,因此可從處理時間得知前幾個字元是正確的。即使有不一致也比對到最後,再彙整結果後回傳
此函式只要第1個字元不同就立即回傳,若第1個字元相符則比對第2個字元後才回傳,因此處理時間會隨相符的字元數而變長。攻擊者逐字元嘗試候選字元,並選出時間變長者,就能不必嘗試所有組合而推測出密碼。若把所有字元的差異以互斥或(XOR)等方式彙整,最後再判定,時間就不會隨相符字元數而改變,維持固定。
- A. 結果是正確的,但會從時間洩漏資訊。
- B. 正確。重點是不要製造時間差。
- C. 這種寫法容易遭受計時攻擊。