签名算法

将所有请求参数(key,value 为一组),对数据结构按照 key 的升序,重新排序, 需要对 null 值进行过滤,需要将 boolean 型进行转换为 1 和 0

将排序后参数组合为新的字符串(keyvaluekeyvalue 中间无分割符)

将生成好的字符串进行 MD5 加密

将新的字符串,统一为大写字符串

将生成好的字符串加上“私钥”,形成新的字符串(私钥为 ONex-OMS 系统里面生成)

再进行一次 MD5 加密,得到加密后的字符串

再统一为大写字符串,得到最终的签名字符串 注意:从“系统级参数”开始到“业务级参数”全部作为请求参数.sign 可以不算入,如果 放进去,开始 sign = null ,也会被过滤掉的

package net.wit.util;

import java.io.UnsupportedEncodingException;

import java.net.URLDecoder;

import java.net.URLEncoder;

import java.util.Enumeration;

import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.codec.digest.DigestUtils;

/**

* 类MD5Sign.java的实现描述:MD5签名和验签

*

*

*/

public class MD5Sign {

/**

* 方法描述:将字符串MD5加码 生成32位md5码

*

* [@author](https://my.oschina.net/arthor) leon 2016年10月10日 下午3:02:30

* [@param](https://my.oschina.net/u/2303379) inStr

* [@return](https://my.oschina.net/u/556800)

*/

public static String md5(String inStr) {

try {

return DigestUtils.md5Hex(inStr.getBytes("UTF-8"));

} catch (UnsupportedEncodingException e) {

throw new RuntimeException("MD5签名过程中出现错误");

}

}

/**

* 方法描述:签名字符串

*

*

* [@param](https://my.oschina.net/u/2303379) params 需要签名的参数

* [@param](https://my.oschina.net/u/2303379) appSecret 签名密钥

* @return

*/

public static String sign(HashMap params, String appSecret) {

StringBuilder valueSb = new StringBuilder();

params.put("appSecret", appSecret);

// 将参数以参数名的字典升序排序

Map sortParams = new TreeMap(params);

Set> entrys = sortParams.entrySet();

// 遍历排序的字典,并拼接value1+value2......格式

for (Entry entry : entrys) {

valueSb.append(entry.getValue());

}

params.remove("appSecret");

return md5(valueSb.toString());

}

/**

* 方法描述:验证签名

*

*

* @param appSecret 加密秘钥

* @param request

* @return

* @throws Exception

*/

public static boolean verify(String appSecret, HttpServletRequest request) throws Exception {

String sign = request.getParameter("sign");

if (sign == null) {

throw new Exception(URLDecoder.decode("请求中没有带签名","UTF-8"));

}

if (request.getParameter("timestamp") == null) {

throw new Exception(URLDecoder.decode("请求中没有带时间戳","UTF-8"));

}

Long timestamp=Long.parseLong(request.getParameter("timestamp"));

Long second = (System.currentTimeMillis() - timestamp) / (1000 * 60);

if(second>10){

throw new Exception(URLDecoder.decode("timestamp有效期超过十分钟","UTF-8"));

}

HashMap params = new HashMap();

// 获取url参数

@SuppressWarnings("unchecked")

Enumeration enu = request.getParameterNames();

while (enu.hasMoreElements()) {

String paramName = enu.nextElement().trim();

if (!paramName.equals("sign")) {

// 拼接参数值字符串并进行utf-8解码,防止中文乱码产生

params.put(paramName, URLDecoder.decode(request.getParameter(paramName), "UTF-8"));

}

}

//params.put("appSecret", appSecret);

// 将参数以参数名的字典升序排序

Map sortParams = new TreeMap(params);

Set> entrys = sortParams.entrySet();

// 遍历排序的字典,并拼接value1+value2......格式

StringBuilder valueSb = new StringBuilder();

for (Entry entry : entrys) {

valueSb.append(entry.getValue());

}

String mysign = md5(md5(valueSb.toString().toUpperCase().toString()+appSecret)).toUpperCase().toString();

if (mysign.equals(sign)) {

return true;

} else {

throw new Exception(URLDecoder.decode("签名不正确","UTF-8"));

}

}

}

java md5 签名_java md5签名相关推荐

  1. java 函数签名_Java方法签名和接口

    我们知道方法签名只包括方法名称和参数列表,但不包括方法返回类型.那么为什么我为以下代码收到编译器错误,因为java不区分具有相同签名的方法. public class InterfaceTest im ...

  2. java支付宝rsa2签名_JAVA RSA签名 解签(利用支付宝封装的函数)

    package com.mlgd.api.util; import com.alibaba.fastjson.JSON; import com.alipay.api.AlipayApiExceptio ...

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

    MD5签名方法 我们默认使用MD5的签名方法,也支持RSA256的签名方式. MD5签名规则 构造待签名字符串.待签名字符的生成规则如下:所有发送到后端的请求参数均加入签名,除了sign字端 所有参与 ...

  4. 使用RSA、MD5对参数生成签名与验签

    在日常的工作中,我们对外提供的接口或调用三方的接口往往有一步生成签名或验签的步骤,这个步骤主要是验证调用方是 不是合法的以及内容是否被修改.比如:对于某些网上公开下载的软件,视频,尤其是镜像文件.如果 ...

  5. 用js将待签名数据以UTF-8的格式转字节流,对字节流进行MD5算法得到的签名字节流,再经过Base64转换为字符串

    最近碰到一个接口是要数字签名的,给的示范是用java写的.一开始没明白直接用了对字节流进行了md5加密,后面在java里面把这段代码运行了一遍才发现md5加密后仍然是字节流,然后在md5中找到了这个 ...

  6. java签名软件_Java实现签名工具类

    一 点睛 签名和验证签名常常用于网络安全,在此提供一个工具类. 二 代码 package com.imooc.demo.common.util; import org.apache.commons.c ...

  7. md5只是用来签名,签名的作用是保证数据完整不会被破坏而已。签名和加密是两回事...

    md5只是用来签名,签名的作用是保证数据完整不会被破坏而已,多一个sign标签,sign的值就是md5生成的字符串.签名和加密是两回事

  8. 签名MD5与文件MD5概念

    文件MD5 在线计算值工具: http://www.metools.info/other/o21.html 签名MD5 在线签名md5值生成工具: https://www.zixuephp.net/t ...

  9. MD5 SHA1 哈希 签名 碰撞 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

最新文章

  1. 人与人的差距在于认知
  2. YOLO-Fastest从Darknet源码编译、测试再到训练完整图文教程!
  3. 不错的Android开发网站
  4. 大数据入门级学习路线
  5. 以《英雄联盟》为例,看影响MOBA游戏策略的3个层面
  6. 微信实时Look-alike算法分享赏析
  7. java aio复制文件_java复制文件的4种方式及拷贝文件到另一个目录下的实例代码...
  8. 数据结构课上笔记15
  9. 【debug】requests.exceptions.ChunkedEncodingError: (‘Connection broken: IncompleteRead(0 bytes read)‘
  10. nginx配置一个简单的php网站遇到的问题
  11. c语言turboc报错显示,C语言新手问个关于C语言在TurboC上运行的问题
  12. Java后台+微信小程序实现推送 “服务通知”
  13. 华为ME909s-821模块电信卡发短信问题
  14. Web功能测试主要包括哪些方面?
  15. Report Categories修改LDB选择屏幕
  16. 数据科学与大数据技术专业 —— 云计算●虚拟化 课程 期末复习卷及其简答(2)
  17. Hexo Next为每篇文章设置自定义的banner图片
  18. 剖析环境加密与文档加密
  19. App Widgets 详解四 RemoteViews、RemoteViewsService和RemoteViewsFactory
  20. linux下启动node服务出现events.js:167 throw er; // Unhandled ‘error‘ event 的解决方法

热门文章

  1. 广告sdk是什么意思?广告SDK分类及用途介绍
  2. Spring data JPA 笔记
  3. AltiumDesigner
  4. 基于bim技术的应用软件有哪些?提高bim工作效率的revit插件?
  5. 《CSS禅意花园》明日上市
  6. 大公司病,太TM形象了!
  7. vue 路由history模式打包部署 The requested URL * was not found on this server. 的解决方法
  8. 50. 从暗通道先验去雾到海底图像修复-三维重建辅助计算摄影
  9. Java之Builder模式
  10. 高德地图获取地址坐标