我正在寫一個程序,它使用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)等中是否有適當的工具。