2014-02-19 63 views
2

比較我正在編寫一個程序,它與pbkdf2 method using cryptopp散列密碼。恆定時間密碼摘要使用加密++

我在驗證密碼時遇到了問題。我試圖比較「length-constant」時間的輸出,但它總是失敗並返回false。

// a and b are std strings containing the output of the DeriveKey function 

unsigned diff = a.length()^b.length(); 
for(unsigned i = 0; i < a.length() && i < b.length(); i++) 
{ 
     diff |= (unsigned)a[i]^(unsigned)b[i]; 
} 

bool equal = diff == 0; 

正在使用「slow equals」即使是驗證pbkdf2密碼的正確方法嗎?我對此有點困惑。

回答

1

我正在寫一個程序,它使用cryptopp與pbkdf2方法哈希密碼。

您鏈接到Crypto ++主頁面,而不是您特定使用的PBKDF。這裏的some code以防萬一(它使用IETF測試向量自RFC 6070):

int main(int argc, char* argv[]) 
{ 
    byte password[] ="password"; 
    size_t plen = strlen((const char*)password); 

    byte salt[] = "salt"; 
    size_t slen = strlen((const char*)salt); 

    int c = 1; 
    byte derived[20]; 

    PKCS5_PBKDF2_HMAC<CryptoPP::SHA1> pbkdf2; 
    pbkdf2.DeriveKey(derived, sizeof(derived), 0, password, plen, salt, slen, c); 

    string result; 
    HexEncoder encoder(new StringSink(result)); 

    encoder.Put(derived, sizeof(derived)); 
    encoder.MessageEnd(); 

    cout << "Derived: " << result << endl; 

    return 0; 
} 

我試圖比較「長度不變」時的輸出,但它總是失敗並返回false。

加密+具有恆定的時間比較內置的。從misc.h使用VerifyBufsEqual。來源可在misc.cpp

$ cd cryptopp 
$ grep -R VerifyBufsEqual * 
cryptlib.cpp: return VerifyBufsEqual(digest, digestIn, digestLength); 
default.cpp: if (!VerifyBufsEqual(check, check+BLOCKSIZE, BLOCKSIZE)) 
fipstest.cpp: if (!VerifyBufsEqual(expectedModuleMac, actualMac, macSize)) 
fipstest.cpp: if (VerifyBufsEqual(expectedModuleMac, actualMac, macSize)) 
misc.cpp:bool VerifyBufsEqual(const byte *buf, const byte *mask, size_t count) 
misc.h:CRYPTOPP_DLL bool CRYPTOPP_API VerifyBufsEqual(const byte *buf1, const byte *buf2, size_t count); 
pssr.cpp: valid = VerifyBufsEqual(representative + representativeByteLength - u, hashIdentifier.first, hashIdentifier.second) && valid; 
pubkey.cpp: return VerifyBufsEqual(representative, computedRepresentative, computedRepresentative.size()); 
secblock.h:  return m_size == t.m_size && VerifyBufsEqual(m_ptr, t.m_ptr, m_size*sizeof(T)); 

我不清楚的是:VerifyBufsEqual是基於等長度的緩衝區。我不確定是否可以忽略「不等長」的情況。


還有一個關於信息堆棧交換可能相關的問題:Timing attacks on password hashes。但我不確定是否/如何推廣到任意緩衝區比較。

這個問題激起了我對一般問題的答案的興趣(問題一直存在):Constant time compares when array sizes are not equal?。這應該告訴我們在VerifyBufsEqual(Crypto ++),CRYPTO_memcmp(OpenSSL)等中是否有適當的工具。