ハードウェアセキュリティ
上のパスワードの比較の関数に潜む問題と、対策の組み合わせとして正しいものはどれか。
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文字目を比べてから戻るので、合っている文字の数だけ処理時間が長くなります。攻撃者は1文字ずつ候補を試し、時間が長くなったものを選べば、全部の組み合わせを試さずにパスワードを推測できます。すべての文字の違いを排他的論理和などでまとめて最後に判定すれば、時間は合っている文字の数によらず一定になります。
- A. 結果は正しいですが、時間から情報が漏れます。
- B. 正しい。時間の差を作らないことが大切です。
- C. タイミング攻撃に弱い書き方です。