【问题标题】:cout and sleep cause different resultscout 和 sleep 导致不同的结果
【发布时间】:2014-03-22 07:19:28
【问题描述】:

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

我使用pqxx 读取数据库,使用rg3's bcrypt 哈希/检查密码。

我第一次发现问题的代码sn-p:

// 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;
}

第一个代码sn-p中的字符串inputPass不作为其他线程的引用传递;它被复制了。

【问题讨论】:

  • 听起来可能是由数据竞争引起的时间问题。如果您使用线程,您是否正确使用互斥锁?
  • 我正在使用线程(它是一个 Web 服务器),据我所知,我正在正确使用我的互斥锁。在这个具体的例子中,唯一需要的互斥锁是 pqxx 连接,它在第一个 sn-p 的方法开始时被锁定。
  • 你检查过字符串不为空/有效吗?
  • 我现在引入了一个检查,字符串不为零(是60个字符,这是正确的哈希大小)。此外,我的字符串检查没有使 checkPassword() 正确评估。
  • 之前的检查是在调用checkPassword()之前完成的。将检查放在checkPassword() 中会导致checkPassword() 正确运行。

标签: c++ postgresql bcrypt libpqxx


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多