c++ - 我可以使用加密哈希作为文件名还是必须先转换它?

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

最佳答案

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

关于c++ - 我可以使用加密哈希作为文件名还是必须先转换它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7803280/

相关文章:

php - 裁剪后的哈希更难破解吗?

javascript - 基于哈希密码加密数据

c++ - 什么是 boost 密集 C++/模板编译的良好 CPU/PC 设置?

c++ - 使用样式表不显示 QT 背景图像

c - 如何在 Visual C 中对视频进行编码?

c++ - 如何检查按钮是否被按下

string - 以字符串数组作为输入向量的分类

c++ - 在属于类 "No matching function for call to swap()"的 vector 上调用 sort()

c++ - 如何在C++中将多个文件包装到同一个命名空间中

c - 如果设置了 SIF_DISABLENOSCROLL,SetScrollInfo() 是否会隐藏滚动条?