首页 > 解决方案 > C# HttpWebRequest - 无法解析此请求:“客户端将 MD5 哈希添加到 X-OriginalHash HTTP 标头”

问题描述

我需要发送 json 数据并从 Web 服务器接收响应。我可以与网络服务器通信,它给了我关于 json 的响应(纠正什么)。有一刻它给了我以下错误消息:

哈希信息与消息签名不匹配。

关于此消息,文档(由该网络服务器的所有者发送)说明如下:

======================================

Repository 系统将验证消息校验和,以确保整个 Repository 系统的各个部分之间的数据没有被篡改。不接受散列无效的消息。这种完整性检查确保构成流量的消息不能在传输过程中或在存储库系统的各个部分内被更改,也不能在不检测的情况下从序列中添加或删除消息。客户端将 MD5 散列添加到 X-OriginalHash HTTP 标头。

然后将此结构添加到消息中

消息头

| X-OriginalHash | 1234567890abcdefghijklmnopqrstuvwxyz |

| 内容类型 | 应用程序/json |

| 授权 | <令牌> |

======================================

所以,它说我应该向那个 HTTP 标头添加一个 MD5 哈希。但我找不到解决方案。

我的代码如下:

==================================================== ========

private void sendDataToWebserver()
{
    token = myFunctionToGetOauthToken();
    byte[] byteBodyProd = Encoding.UTF8.GetBytes(requestTextBox.Text);

    HttpWebRequest bearerReqProd = WebRequest.Create("https://webserver.com") as HttpWebRequest;
    bearerReqProd.Method = "POST";
    bearerReqProd.PreAuthenticate = true;
    bearerReqProd.ContentType = "application/json";
    bearerReqProd.ContentLength = byteBodyProd.Length;
    bearerReqProd.Headers.Add("Authorization", token);
    bearerReqProd.Headers.Add("grant_type", "client_credentials");
    bearerReqProd.Headers.Add("cache-control", "no-cache");

    bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5(requestTextBox.Text));

    Stream newStreamProd = bearerReqProd.GetRequestStream();
    newStreamProd.Write(byteBodyProd, 0, byteBodyProd.Length);

    WebResponse bearerRespProd = null;
    try

        bearerRespProd = bearerReqProd.GetResponse();
    }
    catch (WebException webErr)
    {
        string response;

        using (var reader = new System.IO.StreamReader(webErr.Response.GetResponseStream()))
        {
            response = reader.ReadToEnd();
            statusText.Text += "\r\n" + "responseProd=" + response.ToString();
        }

        statusText.Text += "\r\n" + "Eroare WebException(Prod): " + webErr.Message;
        return;
    }
    catch (Exception err)
    {
        statusText.Text += "\r\n" + "Eroare Exception(Prod): " + err.Message;
        return;
    }

    var responseProd = "";
    using (var reader = new StreamReader(bearerRespProd.GetResponseStream(), Encoding.UTF8))
    {
        responseProd = reader.ReadToEnd();
        statusText.Text += "\r\n" + "responseProd=" + responseProd.ToString();
    }
}

   private string CreateMD5(string input)
    {
        // Use input string to calculate MD5 hash
        using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
        {
            byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
            //byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(input);
            byte[] hashBytes = md5.ComputeHash(inputBytes);

            // Convert the byte array to hexadecimal string
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hashBytes.Length; i++)
            {
                sb.Append(hashBytes[i].ToString("X2"));
            }
            return sb.ToString();
        }
    }

==================================================== ========

要发送的数据在 requestTextBox.Text 中,示例如下:

{“ID1”:“EO144IB3002”,

“ID2”:“FACILIB300”,

"Event_Time": "19062320",

“Destination_ID1”:“2”}

在上面的代码中,我为该 MD5 哈希规范生成的代码行是:

bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5(requestTextBox.Text));

这是正确的方法吗?似乎不是,因为我得到了错误。有没有什么标准方法可以让我按照他们要求的方式添加 MD5 哈希 HTTP 标头?我也尝试了很多替代方案:

bearerReqProd.Headers.Add("X-OriginalHash", bearerReqProd.GetHashCode().ToString());
bearerReqProd.Headers.Add("X-OriginalHash", System.Convert.ToBase64String(byteBodyProd));
bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5(System.Text.Encoding.UTF8.GetString(byteBodyProd, 0, byteBodyProd.Length)));
bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5(requestTextBox.Text));
bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5(requestTextBox.Text + "1234567890abcdefghijklmnopqrstuvwxyz"));
bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5(requestTextBox.Text) + "1234567890abcdefghijklmnopqrstuvwxyz");
bearerReqProd.Headers.Add("X-OriginalHash", "1234567890abcdefghijklmnopqrstuvwxyz");
bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5("1234567890abcdefghijklmnopqrstuvwxyz"));
bearerReqProd.Headers.Add("X-OriginalHash", Convert.ToBase64String(MD5.Create().ComputeHash(System.Text.Encoding.ASCII.GetBytes("1234567890abcdefghijklmnopqrstuvwxyz"))));

我知道尝试即使是我认为不是解决方案的东西也是一种丑陋的方式……但是当您没有任何其他解决方案并且无法获得所需的东西时……</p>

感谢您的任何帮助 !

标签: c#jsonhttpwebrequestmd5

解决方案


问题是一个愚蠢的问题……当两个系统相遇时会发生这种情况,但是当问题发生时您看不到详细信息。该行是: sb.Append(hash[i].ToString("X2")); 我从某人那里复制了代码,它是大写的 X2,而不是小写的 x2。因此,代码生成了所有大写字符串,并且服务器显然区分大小写,因此字符串不匹配。我无法告诉你我产生了什么解决方案:在 aspx 页面上的 Java 加密方法......复杂性非常扭曲。

很抱歉给您带来不便,感谢您的暗示!


推荐阅读