物流API开发,MD5校验问题

hbhuo2008 2014-12-07 09:28:08
开发文档

安全及数据完整性:
1、 支持的消息接收方式只支持 HTTP POST;所有 XML/JSON 格式的字符串,以 HTTP POST
方式发送,请求方法的编码格式:“application/x-www-form-urlencoded; charset=UTF-8”;
2、 在 POST 时用“logistics_interface”字段表示要发送的 XML/JSON 内容;
3、 在 POST 时用“data_digest”字段进行签名验证。签名使用 MD5 方式, logistics_interface对
的内容进行签名。原理为:通知内容(xml/json)+密钥,然后进行 MD5,转换为 Base64
字符串。详细解释如下:
假设 xml 内容为:< logisticsEventsRequest ></ logisticsEventsRequest >,密钥为
123456;
那么要签名的内容为<logisticsEventsRequest></logisticsEventsRequest >123456(默认 UTF-8 编码) 经过 md5 和 base64 后的内容就为 LghTkEmsD2tbQ3fsIBRcBg==;
最终要发送的数据为logistics_interface=<logisticsEventsRequest></logisticsEventsRequest>&data_digest=Lg
hTkEmsD2tbQ3fsIBRcBg==& msg_type =tmall.logistics.event.tms.declare&msg_id=2132323;
4、要求 CP 收到消息后,一定要验证数据是否完整及正确;

数据发送和接收处理流程:
数据发送流程:压缩(可选)-> BASE64 编码(可选,默认使用)-> 数字签名-> 发送;
数据接收流程:接收-> 数字签名校验-> BASE64 解码(可选,默认使用)-> 解压(可选)->
处理;

问题是:
要签名的内容为<logisticsEventsRequest></logisticsEventsRequest >123456(默认 UTF-8 编码) 经过 md5 和 base64 后的内容就为 LghTkEmsD2tbQ3fsIBRcBg==;

我用C#自带的md5和base64加密方式都无法转为 LghTkEmsD2tbQ3fsIBRcBg==,
<logisticsEventsRequest></logisticsEventsRequest >123456经过MD5加密后:2D37B7E39A8FB2407FCE96172B991573再经过base64加密后:MkQzN0I3RTM5QThGQjI0MDdGQ0U5NjE3MkI5OTE1NzM=

文档里的LghTkEmsD2tbQ3fsIBRcBg==是怎么来的,求解答,谢谢。

有相关API开发经验的高手不吝赐教啊!
...全文
167 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbhuo2008 2014-12-13
  • 打赏
  • 举报
回复
引用 2 楼 github_22161131 的回复:
他给的文档一定是从别的地方抄的,改了数据却没改md5的结果,下面的代码才能生成输出LghTkEmsD2tbQ3fsIBRcBg==

var str = "<order></order>123456";
using(var md5 = new MD5CryptoServiceProvider())
{
    var b = md5.ComputeHash(Encoding.UTF8.GetBytes(str));
    Console.WriteLine(Convert.ToBase64String(b));
}
运行出错。。
winnowc 2014-12-08
  • 打赏
  • 举报
回复
他给的文档一定是从别的地方抄的,改了数据却没改md5的结果,下面的代码才能生成输出LghTkEmsD2tbQ3fsIBRcBg==

var str = "<order></order>123456";
using(var md5 = new MD5CryptoServiceProvider())
{
    var b = md5.ComputeHash(Encoding.UTF8.GetBytes(str));
    Console.WriteLine(Convert.ToBase64String(b));
}
threenewbee 2014-12-08
  • 打赏
  • 举报
回复
从长度上看,应该是2D37B7E39A8FB2407FCE96172B991573直接放在byte[]中做base64编码。
橡木疙瘩 2014-12-08
  • 打赏
  • 举报
回复
我的计算 结果应该是:“LTe345qPskB/zpYXK5kVcw==” 不知道对不对。 不过楼主的计算结果肯定有问题,因为最后编码太长了,应该是多了”把MD5编码结果进行16进制编码“这一步。 数组”经MD5加密“的结果应该是byte[]类型,而不应该是string类型。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧