Win32 MD5哈希器的奇怪行为
Strange behavior of Win32 MD5 hasher
我使用此函数生成字符串的哈希
std::string MD5(string input)
{
BYTE BytesHash[33];//!
DWORD dwHashLen;
string final;
HCRYPTPROV CryptProv;
HCRYPTHASH CryptHash;
if (CryptAcquireContext(&CryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET)) {
if (CryptCreateHash(CryptProv, CALG_MD5, 0, 0, &CryptHash)) {
if (CryptHashData(CryptHash, (BYTE*)input.c_str(), input.length(), 0)) {
if (CryptGetHashParam(CryptHash, HP_HASHVAL, BytesHash, &dwHashLen, 0)) {
final.clear();
string hexcharset = "0123456789ABCDEF";
for (int j = 0; j < 16; j++) {
final += hexcharset.substr(((BytesHash[j] >> 4) & 0xF), 1);
final += hexcharset.substr(((BytesHash[j]) & 0x0F), 1);
}
}
}
}
} CryptDestroyHash(CryptHash);
CryptReleaseContext(CryptProv, 0);
return final;
}
但我有一个问题。某些编译二进制文件的用户无法生成 md5。但是,我在某些行之间插入:
cout << "randomstring:gfdgfdgfdgfdg" << endl;
现在一切都对这些用户有效,但对其他一些用户不起作用。管他呢?
CryptGetHashParam的第4个参数,pdwDataLen
,有两个函数。输入时,它指定可用缓冲区的长度。退出时,它包含实际使用的数据的长度。这在Windows API中是相当普遍的概念。
由于您不使用任何值初始化dwHashLen
,因此堆栈上当前的任何内容都将传递给函数。如果它小于哈希值的大小,则它不起作用,并且函数返回错误。如果它碰巧更大,它就会起作用。执行其他一些不相关的操作可以随机更改堆栈,因此有时使其工作。
因此,解决方案是像这样初始化大小:
DWORD dwHashLen = sizeof(BytesHash);
下次发生这样的事情时,您可能需要检查GetLastError()
,它会告诉您有关出错的提示(ERROR_MORE_DATA
(。
相关文章:
- 在Javascript和C++中计算MD5哈希的不同结果
- CPP unordered_set只使用比较器而不是哈希
- 将私有结构哈希器运算符转换为静态
- 迭代器关系运算符出错(带单独链接和迭代器的自定义哈希表)
- 如何将单个字符转换为为基本密码哈希器设置整数,C++
- MD5哈希的密码盐字符串的格式是什么?
- 阻止基于md5哈希执行特定的.exe文件
- Win32 MD5哈希器的奇怪行为
- 数字序列的 MD5 哈希
- 在C++中是否已经为文件系统迷你过滤器驱动程序编写了一个计算MD5哈希的函数
- 这个自定义 md5 哈希算法是如何实现的
- 逐行散列文件时错误的 md5 哈希值
- hash_set哈希器函数
- 如何在Qt中创建MD5哈希
- 使用openssl/MD5时出现意外的MD5哈希值
- C++:如何将带有 md5 哈希的 wstring 转换为字节* 数组
- 如何在c++代码中返回字符串的md5哈希值
- c++将十六进制md5哈希值转换为十进制整数
- (C++) 无法迭代密钥哈希器函数中的向量
- MD5哈希函数输出垃圾