2012年4月24日 星期二

[C++] 如何儲存帳號密碼

帳號密碼算是蠻私密的資訊(羞),我們該如何存這些東西?可以參考 MongoDB 的實做。mongo / src / mongo / db / security_commands.cpp
md5digest d;
{
    digestBuilder << user << pwd;
    string done = digestBuilder.str();

    md5_state_t st;
    md5_init(&st);
    md5_append(&st, (const md5_byte_t *) done.c_str(), done.size());
    md5_finish(&st, d);
}

string computed = digestToString( d );

if ( key != computed ) {
    log() << "auth: key mismatch " << user << ", ns:" << dbname << endl;
    errmsg = "auth fails";
    return false;
}
我們拿帳號密碼算 MD5 當 key 存起來(MD5是單向 hash function)。認證時,我們沒辦法從 MD5 反推帳號密碼,只能用使用者輸入的帳號密碼「重新計算」MD5,如果 key 相同,那就是認證成功。因此就算在不同的 database,只要帳號密碼一樣,算出來的 key 都一樣(或許應該再把 database 的名字加進來算 MD5)。

沒有留言:

張貼留言