代码之家  ›  专栏  ›  技术社区  ›  Prof. Falken

是否有一种将sha1散列表示为C字符串的标准方法,以及如何将其转换为C字符串?

  •  6
  • Prof. Falken  · 技术社区  · 14 年前

    This question 是关于如何使用 OpenSSL 图书馆。

    它返回一个包含哈希的20字节数组。有没有一些标准的方法来表示字符串形式的数据,而不是二进制的?

    如果是这样的话,openssl本身是否有一个函数可以转换成所说的字符串格式?

    如果没有,应该怎么做?当然,我可以梦想自己的编码,使用base64或其他什么,但有一些规范格式吗?

    4 回复  |  直到 14 年前
        1
  •  12
  •   Matteo Italia    14 年前

    通常哈希表示为十六进制数字的序列(当然,每字节两个)。您可以使用 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();
    }
    
        2
  •  3
  •   Arc    14 年前

    哈希的标准表示方式是十六进制字符串。
    在C中,您可以使用 printf("%02x", byte) 得到每个字节的十六进制表示。

    MD5的一个例子应该很容易适应SHA:

    http://en.literateprograms.org/MD5_sum_(C,_OpenSSL)

        3
  •  2
  •   James    14 年前

    下面是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);
    
        4
  •  0
  •   Chris Becke    14 年前

    隐私增强邮件(或PEM)似乎为加密数据的文本表示形式的存储设置了标准。 PEM将实际的二进制块存储在base64中,但也有一个文本头和页脚。