2014-02-19 1 views
2

나는 pbkdf2 method using cryptopp으로 암호를 해시하는 프로그램을 작성하고 있습니다.일정 시간 암호 다이제스트는 Crypto ++을 사용하여 비교됩니다.

암호 유효성 검사에 문제가 있습니다. "길이 상수"시간의 출력을 비교하려고했지만 항상 실패하고 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 암호의 유효성을 검사하는 올바른 방법이라도 "느린 같음"을 사용하고 있습니까? 나는 이것에 대해 약간 혼란 스럽다.

답변

1

저는 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) 등에서 적절한 도구가 있는지 알려 주어야합니다.

관련 문제