パスワードのブルートフォースから保護し、有効なユーザー名を検出しようとするタイミング攻撃から保護するために、認証が成功したかどうかに関係なく、ログインプロセスに一定の時間がかかるようにします。要するに、私は常に、結果に関係なく、ログインプロセスに1000msかかることを望んでいます(どちらの結果もその時間の何分の1かかかると仮定します)。Javaでこれを達成するための最良の方法は何ですか?これが私の現在の考え方です。
class ConstantDuration<T> implements Callable<T> {
ConstantDuration(Callable<T> task,long duration) {
this.task = task;
this.duration = duration;
}
public T call() throws Exception {
long start = System.currentTimeMillis();
long elapsed = 0;
T result = null;
try {
result = task.call();
} finally {
elapsed = System.currentTimeMillis() - start;
}
if ( elapsed < duration ) {
Thread.sleep(duration-elapsed);
}
return result;
}
}