【问题标题】:Print the results of MD5 function打印 MD5 函数的结果
【发布时间】:2015-09-03 16:34:41
【问题描述】:

我想为某个字符串打印 MD5。为此我已经完成了功能

std::string generateHashMD5(std::string text)
{
    unsigned char * resultHash;
    resultHash = MD5((const unsigned char*)text.c_str(), text.size(), NULL);
    std::string result;
    result += (char *) resultHash;
    return result;
}

我想打印这个函数的结果。我尝试对此类功能进行版本化。

void printHash(std::string hash)
{
    for (unsigned i = 0; i < str.size(); i++) 
    {
         int val = (short) hash[i];
         std::cout<<std::hex<<val<<':';
    }
    std::cout<<std::endl;
}



std::string printHash(std::string hash)
{
     char arrayResult[200];
     for(int i = 0; i < 16; i++)
          sprintf(&arrayResult[i*2], "%02x", (unsigned short int)hash[i]);
    std::string result;
    result += arrayResult;
    return result;
}

问题是不幸的是,没有一个不显示正确的结果。这个函数应该改什么或者哪里出错了?

【问题讨论】:

  • 任何时候你发现自己在使用 C++ 进行转换,你很可能会犯严重的错误。这没有什么不同。 MD5() 是什么?它记录在哪里?它返回什么?
  • 想向我们展示输出吗?
  • MD5 的结果可能已经是一个十六进制字符串,你不需要将它转换为十六进制。只需按原样打印即可。
  • 它可能是一个 128 位的哈希值。但没有迹象表明谁拥有返回的内存。 OP 需要澄清这一点。

标签: c++ md5


【解决方案1】:

你不当使用std::string作为缓冲区:

result += (char *) resultHash;

将 resultHash 视为 c 字符串,因此如果中间有 \0 字节,它将无法获得足够的数据。如果没有 \0 字节,您将复制太多并获得 UB。您应该使用带大小的构造函数:

std::string result( static_cast<const char *>( resultHash ), blocksize );

块大小可能是 16。但我建议使用 std::array&lt;uint8_t,blocksize&gt;std::vector&lt;uint8_t&gt; 而不是 os std::string,因为 std::string 的缓冲区非常混乱。

【讨论】:

  • 实际上,将char 扩大到unsigned short 不会引发任何字节顺序问题。但是当unsigned char 可以时,这是不必要的。但是您应该使用适当的长度修饰符:sprintf(buff, "%02hhx", (unsigned char)hash[i]);
  • @TobySpeight 同意,没有仔细看,只是觉得他将指针指向了 short 然后取消引用。我的错误
【解决方案2】:

如果MD5返回字节数组

result += (char *) resultHash; return result;

转换为字符串将丢失 0 之后的数字,因为字符串构造函数将输入解释为以空字符结尾的字符串 因此可以使用向量或具有显式字符数的字符串构造。

仍然没有足够的信息可以准确地说出

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-22
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多