我有一个接受用户输入(用户名/密码)的类,bcrypt 对输入密码进行哈希处理以检查它是否与存储在数据库中的哈希匹配,然后如果成功则将用户登录。我遇到的问题是,如果我调用 cout << "\n"
或 sleep(1)
在散列之前,密码检查按预期工作,但如果我注释掉sleep
and cout
,散列器总是失败,这导致用户收到不正确的invalid credentials
消息。
我正在使用pqxx读取数据库,并使用rg3 的 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
不会作为其他线程的引用传递;它被复制了。