为了防止密码暴力破解,并防止试图检测有效用户名的计时攻击,我希望我的登录过程花费恒定的时间,无论身份验证是否成功。简而言之,无论结果如何,我总是希望我的登录过程花费 1000 毫秒(假设任一结果都需要一小部分时间)。在 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;
}
}