我正在编写一个用pbkdf2 method using cryptopp隐藏密码的程序。
我在验证密码时遇到问题。我试图比较“长度 - 常量”时间的输出,但它总是失败并返回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;
使用“慢等于”甚至是正确的方法来验证pbkdf2密码?我对此感到有点困惑。
答案 0 :(得分:1)
我正在使用cryptopp编写一个使用pbkdf2方法散列密码的程序。
您链接到Crypto ++主页,而不是您对PBKDF的特定用途。这里是some code以防万一(它使用来自RFC 6070的IETF测试向量):
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;
}
我试图比较&#34;长度常数&#34;的输出。时间但总是失败并返回false。
Crypto ++内置了一个恒定的时间比较。使用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
是基于相等长度的缓冲区。我不确定是否可以忽略&#34;不等长度&#34;情况下。
还有一个关于信息堆栈交换的问题可能是相关的:Timing attacks on password hashes。但我不确定它是否/如何推广到任意缓冲区比较。
这个问题引起了我对一般问题答案的兴趣(问题始终存在):Constant time compares when array sizes are not equal?。这应该告诉我们,我们是否在VerifyBufsEqual
(加密++),CRYPTO_memcmp
(OpenSSL)等中使用了适当的工具。