This question是关于如何使用OpenSSL库从C中的数据数组创建SHA-1哈希。
它返回一个包含哈希的20个字节的数组。是否有一些标准的方式以字符串形式表示数据,而不是二进制?
如果是这样,OpenSSL本身是否有一个函数转换为所述字符串格式?
如果没有,应该怎么做?当然,我可以编写自己的编码,使用base64或者不是,但是有一些规范的格式吗?
答案 0 :(得分:12)
通常哈希表示为十六进制数字序列(当然,每字节两个)。您可以使用带有正确修饰符的ostringstream
编写代码来轻松编写此类内容:
#include <string>
#include <sstream>
#include <iomanip>
std::string GetHexRepresentation(const unsigned char * Bytes, size_t Length)
{
std::ostringstream os;
os.fill('0');
os<<std::hex;
for(const unsigned char * ptr=Bytes;ptr<Bytes+Length;ptr++)
os<<std::setw(2)<<(unsigned int)*ptr;
return os.str();
}
答案 1 :(得分:3)
表示散列的标准方式是十六进制字符串
在C中,您可以使用printf("%02x", byte)
来获取每个字节的十六进制表示。
MD5的示例应该很容易适应SHA:
答案 2 :(得分:2)
以下是C:
的示例//function
void convertSHA1BinaryToCharStr(const unsigned char * const hashbin, char * const hashstr) {
for(int i = 0; i<20; ++i)
{
sprintf(&hashstr[i*2], "%02X", hashbin[i]);
}
hashstr[40]=0;
}
//Example call. hashbin is the 20byte hash array.
char hashstr[41];
convertSHA1BinaryToCharStr(hashbin, hashstr);
printf("%s\n", hashstr);
答案 3 :(得分:0)
隐私增强邮件(或PEM)似乎为加密数据的文本表示的存储设置了标准。 PEM将实际的二进制块存储在Base64中,但也有文本页眉和页脚。