저는 cryptopp를 사용하여 pbkdf2 메소드로 암호를 해시하는 프로그램을 작성하고 있습니다.
PBKDF를 사용하지 않고 Crypto ++ 기본 페이지에 연결했습니다. 나는 "길이 상수"시간에 출력을 비교하기 위해 노력했다
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를 반환 : 여기 some code이 단지의 경우 (이 RFC 6070에서 IETF 테스트 벡터를 사용)입니다.
Crypto ++에는 일정 시간 비교가 내장되어 있습니다. VerifyBufsEqual
부터 misc.h
까지를 사용하십시오. 출처는 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) 등에서 적절한 도구가 있는지 알려 주어야합니다.