在身份验证服务中,我试图通过一个简单的StringRedisTemplate
对象从Redis中获取密码。
然后,我使用BCryptPasswordEncoder
进行密码匹配。
我发现用户名不匹配与密码不匹配之间存在时间差异。
我读过一些文章说用户名不是一个秘密值,我不必担心-我知道这一点,但就我而言,我希望这两种情况之间没有时差。
我该怎么办?
@PostMapping(value = "/auth", consumes = "application/json")
public ResponseEntity<?> isClientExists(@Valid @RequestBody User user) {
//with redisTemplate.opsForValue().get(sha256Hex(userName)) :
UserDetails user = redisClient.loadUserByUserName(user.getUserName());
if (userNotFound(userFromDB)) {
/* What should I add here to make it time-invariant query? */
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
if (!authenticateUser(user.getPassword(), userFromDB.getPassword())) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
return ResponseEntity.status(HttpStatus.OK).build();
}
private boolean userNotFound(UserDetails userFromDB) {
return (userFromDB == null);
}
private boolean authenticateUser(String userPassword, String userFromDBPassword) {
//with BCryptPasswordEncoder :
return passwordEncoder.matches(userPassword, userFromDBPassword);
}
答案 0 :(得分:0)
两种方法:
1)弄清authenticateUser调用平均需要花费多长时间,然后休眠多长时间(尽管将来的CPU升级时间可能会改变)。
2)只需使用随机数据再次进行一次authenticateUser调用,然后忽略结果即可。