如何计算Body体的Content-MD5值

更新时间:2023-04-27 10:48:51

在进行请求时,e签宝API网关根据请求头中的 Content-MD5 值来校验请求Body体中的数据在传输过程中是否完整或篡改。当e签宝API网关接收到请求Body体时,将e签宝API网关对Body体所计算的 Content-MD5 值和请求头中的 Content-MD5 进行比对,两者一致时说明传输过程中数据完整且未被篡改。

请求Body体Content-MD5计算说明

请求Body体的 Content-MD5 值的计算步骤说明如下:

(1)先对请求Body体中的数据(如JSON字符串)的二进制Byte数组进行计算获得MD5加密后的二进制Byte数组(128位)。

(2)再对这个MD5加密后所获得的二进制Byte数组进行Base64编码(注意不是对MD5的32位字符进行编码)。

请求Body体Content-MD5计算代码示例

JAVA代码示例

public static void main(String[] args) {
        String bodyData = "{\"name\":\"张某人\",\"age\":18}";
        String bodyContentMD5 = getBodyContentMD5(bodyData);
		System.out.println("请求Body体Content-MD5值:" + bodyContentMD5);
	}

	/***
	* 计算请求Body体的Content-MD5
	* @param bodyData 请求Body体数据
	* @return
	*/
	public static String getBodyContentMD5(String bodyData) {
		// 获取Body体的MD5的二进制数组(128位)
		byte[] bytes = getBodyMD5Bytes128(bodyData);
		// 对Body体MD5的二进制数组进行Base64编码
		return new String(Base64.encodeBase64(bytes));
	}

	/***
	 * 获取MD5-二进制数组(128位)
	 * 
	 * @param bodyData 请求Body体数据
	 * @return 
	 */
	public static byte[] getBodyMD5Bytes128(String bodyData) {
		byte[] md5Bytes = null;
		try {
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			md5.update(bodyData.getBytes(StandardCharsets.UTF_8));
			md5Bytes = md5.digest();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return md5Bytes;
	}

PHP代码示例

$bodyData = "{\"name\":\"张某人\",\"age\":18}";
// Body体的Content-MD5值
$bodyContentMD5 = getBodyContentMD5($bodyData);
echo("请求Body体Content-MD5值:".$bodyContentMD5);

function getBodyContentMD5($bodyData){
    //计算Body体的Content-MD5
    $md5Bytes = md5($bodyData,true);
    $contentMD5 = base64_encode($md5Bytes);
    return $contentMD5;
}

.NET代码示例

public static void Main(string[] args)
{
    string bodyData = "{\"name\":\"张某人\",\"age\":18}";
    string bodyContentMD5 = GetBodyContentMD5(bodyData);
    MessageBox.Show("请求Body体Content-MD5值:" + bodyContentMD5);
}

public static string GetBodyContentMD5(string bodyData)
{
    string contentMD5 = null;
    try
    {
        System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
        // 先计算出上传内容的MD5,其值是一个128位(128 bit)的二进制数组
        byte[] md5Bytes = md5.ComputeHash(bodyData.GetBytes("UTF-8"));
        // 再对这个二进制数组进行base64编码
        contentMD5 = Convert.ToBase64String(md5Bytes).ToString();
        return contentMD5;
    }
    catch (Exception ex)
    {
        MessageBox.Show("错误信息", "计算Body体的Content-MD5值时发生异常:" + ex.Message);
        return contentMD5;
    }
}
我要纠错