【问题标题】:Can I use a crypted hash as a filename or do I have to convert it first?我可以使用加密哈希作为文件名还是必须先转换它?
【发布时间】:2011-10-18 06:29:47
【问题描述】:

我正在尝试散列一个字符串,然后将该散列用作文件名。

我的问题: 是我遇到的所有 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);
}

【问题讨论】:

    标签: c++ winapi hash unsigned-char


    【解决方案1】:

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

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

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

    【讨论】:

    • 哈希库可能有一个“hexdigest”函数,你可以调用它而不是“digest”,它会给你十六进制字符。那么真正需要的只是将最后一行转换为std::string,尽管您可能还需要与编译器讨论unsigned char*char* 之间的区别。如果是这样,最好是做std::string(hexHash, hexHash+SHA256_HEXDIGEST_SIZE]);
    猜你喜欢
    • 2016-01-27
    • 2011-02-11
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2013-05-31
    • 2016-10-04
    相关资源
    最近更新 更多