我可以使用加密的哈希作为文件名,还是必须先将其转换?

时间:2011-10-18 06:29:47

标签: c++ winapi hash unsigned-char

我正在尝试散列字符串,然后使用该散列作为文件的名称。

我的问题:是我遇到的所有C ++哈希/加密哈希std :: string或char *&将散列字符串作为 unsigned char *

返回

如何将unsigned 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 个答案:

答案 0 :(得分:4)

散列的结果可能包含映射到文件名中不允许的字符的字节(例如null-char,'+','?'等等)。因此,代码中的“hashStr”可能不是字符串,而只是一个非空终止的字节数组。

尝试使用此小函数将“二进制哈希转换为适合文件名的字符串”

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(), ...);