cryptopp を使用して pbkdf2 メソッドでパスワードをハッシュするプログラムを作成しています。
Crypto++ のメイン ページにリンクしましたが、PBKDF の特定の用途ではありません。念のため、いくつかのコードを示します ( 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;
}
「長さ一定」時間で出力を比較しようとしましたが、常に失敗し、false を返します。
Crypto++ には一定時間の比較が組み込まれています。 from を使用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
のは、同じ長さのバッファーに基づいていることです。「不等長」の場合を見過ごしてよいかどうかはわかりません。
関連する可能性のある Information Stack Exchange に関する質問もあります: Timing attack on password hashes。しかし、それが任意のバッファ比較に一般化されるかどうか/どのように一般化されるかはわかりません。
この質問は、一般的な問題への回答に私の興味をそそりました (質問は常にそこにありました) 。. VerifyBufsEqual
(Crypto++)、CRYPTO_memcmp
(OpenSSL) などに適切なツールがあるかどうかがわかります。