cout和sleep导致不同的结果

时间:2014-03-21 16:12:14

标签: c++ postgresql bcrypt libpqxx

我有一个接受用户输入(用户名/密码)的类,bcrypt哈希输入密码以检查它是否与存储在数据库中的哈希相匹配,然后如果成功则记录用户。我遇到的问题是,如果我在散列之前调用cout << "\n"sleep(1),则密码检查会按预期工作,但如果我注释掉sleepcout, hasher 始终失败,导致用户收到错误的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不作为来自其他线程的引用传递;它被复制了。

1 个答案:

答案 0 :(得分:1)

如评论中所述,您有同步问题。

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

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

PS: 令人困惑的是#34; \ n&#34;效果具有刷新缓冲区的习惯,导致同步。