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

发布于 2024-12-11 01:55:17 字数 813 浏览 0 评论 0原文

我正在尝试对字符串进行哈希处理,然后使用该哈希值作为文件名。

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

I am trying to hash a string then use that hash as the name of a file.

My problem: is that all the C++ hashers/crypters I have come across hash a std::string or char* & return the hashed string as an unsigned char*?

How do I convert that unsigned char* to a char* or std::string so I can then write it to a file or filename? Or do I not need to convert it to a normal string to use it?

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);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

半透明的墙 2024-12-18 01:55:17

散列的结果可能包含映射到文件名中不允许的字符的字节(例如空字符、“+”、“?”等......)。因此,代码中的“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(), ...);

The result of the hash likely contain bytes that map to chars that are not allowed in a filename (e.g. null-char, '+', '?', etc....). So "hashStr" in your code isn't likely to be a string, but just an array of bytes that aren't null terminated.

Try this little function to convert from "binary hash to string suitable for file 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);
}

In your above code example, you'd call it as follows:

std::string str;
HashToString(hashStr, &str);
HANDLE newF = CreateFileA(str.c_str(), ...);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文