java md5签名算法_MD5请求签名规则

MD5签名方法

我们默认使用MD5的签名方法,也支持RSA256的签名方式。

MD5签名规则

构造待签名字符串。待签名字符的生成规则如下:所有发送到后端的请求参数均加入签名,除了sign字端

所有参与签名的请求参数都按照名称字符升序排列(参数名称不允许相同)

如果参数值带有中文, 需要制定字符集编码为UTF-8

如果参数值为空,那么该参数不参与签名

将采宝的合作秘钥作为最后一个参数, 参数名为:key, 参数值就是采宝的合作秘钥本身

将请求参数用`&`拼接起来(按照名称字符升序排列)

用MD5算法,对待签名字符串进行加密, 生成的签名数据(32位小写字符), 就是公共参数中sign的值。

签名示例

大家可以根据这个示例,来验证自己的签名结果是否正确。

现有如下参数参与签名:

参数名

参数值

barcode

123123123123

local_order_no

localorderno123123123123

app

zyptestapp

operator_id

axgdfdafd34124

amount

100

un_discount_amount

timestamp

1460512556270

subject

这是一笔支付订单

goods_list

那么生成的待签名字符串为(合作秘钥的值设为:thisistestkey):

amount=100&app=zyptestapp&barcode=123123123123&local_order_no=localorderno123123123123&operator_id=axgdfdafd34124&subject=这是一笔支付订单&timestamp=1460512556270&key=thisistestkey

注:因为un_discount_amount和goods_list两个参数的值为空,所以没有参与签名

签名结果为:

37fd31004368f9e616f277c6436985eb

md5签名方法示例(java)

/**

* 使用md5算法进行加密

*

* @param target

* 要加密的字符串

* @param charset

* 编码(请设置为UTF-8)

* @return 加密后的字符串

*/

public static String encryptWithMD5(String target,String charset) {

String md5Str = null;

try {

MessageDigest md5 = MessageDigest.getInstance("MD5");

md5.reset();

byte[] bytes = md5.digest(charset==null?target.getBytes():target.getBytes(charset));

StringBuffer stringBuffer = new StringBuffer();

for (byte b : bytes) {

int bt = b & 0xff;

if (bt < 16) {

stringBuffer.append(0);

}

stringBuffer.append(Integer.toHexString(bt));

}

md5Str = stringBuffer.toString();

} catch (Exception ex) {

logger.error("encrypt error,target:" + target, ex);

}

return md5Str;

}

生成签名串并签名的方法示例

/**

* 对params中的参数进行排序后生成签名串

* @param params 参与签名的参数map

* @param key 签名要用到的加密串

* @return

*/

String sign=null;

StringBuffer sb = new StringBuffer();

//排序

List> infoIds =

new ArrayList>(params.entrySet());

Collections.sort(infoIds, new Comparator>() {

public int compare(Map.Entry o1, Map.Entry o2) {

return (o1.getKey()).toString().compareTo(o2.getKey());

}

});

//对参数数组进行按key升序排列,然后拼接,最后调用5签名方法

int size = infoIds.size();

for(int i = 0; i < size; i++) {

if(CheckUtil.isNotEmpty(infoIds.get(i).getValue())) {//不为空,为空的不参与签名

sb.append(infoIds.get(i).getKey() + "=" + infoIds.get(i).getValue() + "&");

}

}

String newStrTemp = sb.toString()+"key="+key.trim();

//获取sign_method

sign = EncryptionUtil.encryptWithMD5(newStrTemp,"UTF-8");

return sign;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值