fix(auth): run dummy Argon2 verify for non-existent users to prevent timing enumeration
用户不存在时执行一次固定合法哈希的 verify(必然失败),抹平与「密码错误」 路径的时序差,防止通过响应时间枚举账号(L2)。dummy 哈希走 spawn_blocking, 与真实校验路径耗时一致;响应消息保持一致。
This commit is contained in:
parent
05c01ccebe
commit
1c6974ca68
@ -201,6 +201,16 @@ pub async fn login(username: String, password: String) -> Result<AuthResponse, S
|
||||
{
|
||||
Ok(Some(row)) => row,
|
||||
Ok(None) => {
|
||||
// 用户不存在时也执行一次 Argon2 verify,抹平「用户不存在」与
|
||||
// 「密码错误」的响应时序差,防止通过响应时间枚举账号(L2)。
|
||||
// 用固定合法哈希做 verify(必然失败),耗时与真实校验一致。
|
||||
const DUMMY_HASH: &str =
|
||||
"$argon2id$v=19$m=19456,t=2,p=1$j3rNaAXzdExYaL94WBWtfg$n1S75LUQKaYJwaRl5bkFF/f/N1tLfRYR/7TuQxKP94c";
|
||||
let dummy_pw = password.clone();
|
||||
let _ = tokio::task::spawn_blocking(move || {
|
||||
crate::auth::password::verify_password(&dummy_pw, DUMMY_HASH)
|
||||
})
|
||||
.await;
|
||||
return Ok(AuthResponse {
|
||||
success: false,
|
||||
message: "Invalid credentials".to_string(),
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user