Могу ли я использовать зашифрованный хеш в качестве имени файла или мне нужно сначала преобразовать его? - PullRequest
1 голос
/ 18 октября 2011

Я пытаюсь хэшировать строку, а затем использовать этот хэш в качестве имени файла.

Моя проблема: заключается в том, что все хэши / криптеры C ++, с которыми я сталкивался, хэшируют std :: string или char * и возвращают хешированную строку как беззнаковый char *?

Как мне преобразовать этот беззнаковый char * в char * или std :: string, чтобы я мог записать его в файл или имя файла? Или мне не нужно преобразовывать его в обычную строку, чтобы использовать его?

tstring hashString( tstring str )
{
    // Post: 

    unsigned char hashStr[SHA256_DIGEST_SIZE];
     std::string messageStr = str;

    SHA256::getInstance()->digest( messageStr, hashStr );
    //TCHAR *hashStrSigned = reinterpret_cast <TCHAR*>(hashStr);

    // can I just use this hashStr to create a file? Or do I have to convert it to char* to use?

    Handle newF = CreateFile( (LPTSTR)hashStr, GENERIC_ALL, 0, NULL, CREATE_ALWAYS, 
                              0, NULL );

    return tstring(hashStrSigned);
}

1 Ответ

4 голосов
/ 18 октября 2011

Результат хеша, вероятно, содержит байты, которые отображаются в символы, которые не разрешены в имени файла (например, null-char, '+', '?' И т. Д ....).Так что «hashStr» в вашем коде, скорее всего, не будет строкой, а просто массивом байтов, которые не заканчиваются нулем.

Попробуйте эту маленькую функцию преобразовать из «двоичного хеша в строку, подходящую для файла».name "

void HashToString(unsigned char* shaHash, std::string* pStr)
{
    char szHash[SHA256_DIGEST_SIZE*2+1];
    char* pszOut = szHash;

    for (int x = 0; x < SHA256_DIGEST_SIZE; x++)
    {
        sprintf(pszOut, "%.2X", shaHash[x]); // write out as hex chars
        pszOut += 2; // advance 2 chars
    }
    *pszOut = '\0'; // null terminate

    *pStr = std::string(szHash);
}

В приведенном выше примере кода вы бы назвали его следующим образом:

std::string str;
HashToString(hashStr, &str);
HANDLE newF = CreateFileA(str.c_str(), ...);
...