gpt4 book ai didi

c++ - cout 和 sleep 导致不同的结果

转载 作者:行者123 更新时间:2023-11-28 07:00:32 26 4
gpt4 key购买 nike

我有一个接受用户输入(用户名/密码)的类,bcrypt 对输入密码进行哈希处理以检查它是否与存储在数据库中的哈希匹配,如果成功则让用户登录。我遇到的问题是,如果我调用 cout << "\n"sleep(1)在散列之前,密码检查按预期工作,但如果我注释掉 sleepcout ,哈希器总是失败,导致用户得到不正确的 invalid credentials消息。

我正在使用 pqxx读取数据库,rg3's bcrypt散列/检查密码。

我第一次发现问题的代码片段:

// pqxx::result
string storedPass = result.begin()["passwordBCrypt_12"].as<string>();

// Uncommenting either cout or sleep causes checkPassword to work as expected
//cout << "\n"; // Confusingly, cout must contain "\n" to have the effect
//sleep(1);
if (!checkPassword(inputPass, storedPass))
credError = true;


checkPassword() 的代码:

bool DB::checkPassword(string& password, string& passwordHash){
char cpassword[password.length()];
char hashInDatabase[BCRYPT_HASHSIZE];
char outTestHash[BCRYPT_HASHSIZE];

for (size_t i = 0; i < password.length(); i++){
cpassword[i] = password[i];
}
for (size_t i = 0; i < BCRYPT_HASHSIZE; i++){
hashInDatabase[i] = passwordHash[i];
}

if (bcrypt_hashpw(cpassword, hashInDatabase, outTestHash) == 0){
if (strcmp(hashInDatabase, outTestHash) == 0) {
// password matches
return true;
}
// password does not match
}
return false;
}

字符串 inputPass第一个代码片段未作为其他线程的引用而流传下来;它被复制了。

最佳答案

如评论中所述,您遇到了同步问题。

根据经验,只要 sleep 或 cout(或 printf)解决了您的问题,那么您就没有在程序的某些语句中正确实现互斥锁逻辑。

您考虑更正 checkPassword 函数。您是否 100% 确定存储通行证的方式不需要某种同步?

附言:令人困惑的“\n”效果有刷新缓冲区的习惯,从而导致同步。

关于c++ - cout 和 sleep 导致不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22563864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com