反射攻撃
反射攻撃を防ぐ一つの方法はセッショントークン(英語版)を使用することである。ボブはアリスにワンタイム・トークンを送り、アリスはこのトークンでパスワードを変換し、結果をボブに送る(例えば、セッショントークンをパスワードに付加してハッシュ関数を計算する)。ボブの側では同じ計算を行う。両方の計算結果が一致するときに限り、ログインは成功する。ここで、マロリーがこの値を記録して、別のセッションでこれを使おうとすることを仮定する。ボブは異なるセッショントークンを送り、マロリーが以前に記録した値で応答する場合、ボブの計算結果と異なることになる。
セッショントークンは(擬似-)乱数によるプロセスによって選ばなければならない。さもなければ、マロリーは将来使用されるトークンのいくつかを推測し、アリスに推測したトークンを変換に使用させることができるかもしれない。マロリーはあとでアリスの応答を再利用し、ボブは受け入れることになる。
ボブは使い捨ての数字を送ることもできるが、メッセージ認証コード (MAC) も含めておくべきである。アリスはこれを確認するべきである。
タイムスタンプは反射攻撃を防ぐもう一つの方法である。時刻同期は安全なプロトコルで実現されなければならない。例えば、ボブは MAC と同時にボブの時刻を定期的に送信する。アリスがボブにメッセージを送りたい場合、アリスはボブの時計の予測値をメッセージに含め、メッセージ全体を認証する。ボブはタイムスタンプが許容範囲内である場合だけメッセージを受領する。この方式の長所は、ボブが(擬似-)乱数を生成する必要がないことである。