范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

springboot基于HMACSHA256实现的接口加密

  分享不易,喜欢请关注。
  作为开发者,与第三方进行数据交互并不少见,尤其是互联网平台,需要提供开放式的API,我们除了需要确认对方是对方以外,还需要确保对方提交的内容未经过修改。
  本文拟采用hmac sha256的数字签名,实现接口的防窜改功能。其过程如下:在平台中注册应用系统
  因为平台提供的是一个开放性接口,为了识别接口调用,需要在平台中进行系统注册,以识别应用系统身份。注册后可以得到一个appKey以及一个appSec。(可以随机生成,也可以由用户指定,按需设计)。
  appKey以及appSec是一组公钥以及密钥,在后面需要用到。平台中实现hmac sha256算法import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.util.*; @Slf4j @Data public class HMAC { 	/** 	 * 明文,appKey 	 */ 	private String key; 	/** 	 * 密钥,appScec 	 */ 	private String sec; //TreeMap 对参数有顺序要求 	private Map params=new TreeMap ();  	/** 	 * 添加hmac-sha256参数 	 * @param key 参数名称 	 * @param valu 参数值  	 */ 	public void addParam(String key,String value) { 		this.params.put(key, value); 	}  	/** 	 * 批量添加hmac-sha256参数 	 * @param params htmk-sha256参数 	 */ 	public void addParams(Map params) { 		this.params.putAll(params); 	} 	/** 	 * 对参数进行加密 	 * @return 加密后的字符串 	 */ 	public String encrypt() { 		String message=""; 	//构建成a=1&b=2&c=3的字符再加密 		for(String key:params.keySet()) { 			String text=key+"="+params.get(key); 			message=message.equals("")?text:message+"&"+text; 		} 		//log.info(message); 		return encrypt(message); 	} 	public boolean check(String checkToken) { 		String token=encrypt(); 		return token.equals(checkToken); 	}  	private  String byteArrayToHexString(byte[] b) { 		StringBuilder hs = new StringBuilder(); 		String stmp; 		for (int n = 0; b != null && n < b.length; n++) { 			stmp = Integer.toHexString(b[n] & 0XFF); 			if (stmp.length() == 1) 				hs.append("0"); 			hs.append(stmp); 		} 		return hs.toString().toLowerCase(); 	}     private String encrypt(String message) { 		 		String hash = ""; 		try { 			//String secret=getHmacSecret();       	if(key==null||key.equals("")) { 				throw new RuntimeException("不存在的公钥"); 			} 			if(sec==null||sec.equals("")) { 				throw new RuntimeException("不存在的密钥"); 			} 			 			Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); 			SecretKeySpec secret_key = new SecretKeySpec(sec.getBytes(), "HmacSHA256");                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    			 			sha256_HMAC.init(secret_key); 			byte[] bytes = sha256_HMAC.doFinal(message.getBytes()); 			hash = byteArrayToHexString(bytes);  		} catch (Exception e) { 		 			e.printStackTrace(); 		} 		return hash; 	} }编写拦截器,对接口进行合法性效验@Component @WebFilter(urlPatterns= {"/api/*"}, filterName = "apiFilter") @Order(1) public class ThirdFilter  implements Filter { 	@Autowired 	MicroConfig microConfig;//这是用平获取appKey的服务 	@Override     public void init(FilterConfig filterConfig) throws ServletException { 		log.info("加载第三方资源请求>>appFilter");     } 	@Override 	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 			throws IOException, ServletException { 		HttpServletResponse res=(HttpServletResponse) response; 		HttpServletRequest hres=(HttpServletRequest) request; 		if(microConfig==null){ 			BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext()); 			microConfig=(MicroConfig) factory.getBean("microConfig"); 			 		}      String appKey=null;      String appSec=null;      String token=null; 	   HMAC hmac=new HMAC(); 			for(String key:request.getParameterMap().keySet()) {        	if(key.equals("appKey")){           appSec=microConfig.getAppSec();           appKey=request.getParameter(key);         }else	if(key.equals("token")) { 					token=request.getParameter(key); 				}else{           params.put(key, request.getParameter(key));         } 			} 	     hmac.setKey(appKey);        hmac.setSec(appSec);        if(!hmac.check(token)){          throw new RuntimeException("数字签名不正确,信息可能被修改。");        } 			} 		chain.doFilter(request, response); 	} }第三方调用
  第三方需要实现一个和平台HMAC一样的算法,对传输的内容进行加密。需要注意的是,平台对参数处理采用的是TreeMap,即需要从小到大进行排序处理,大家可以想想为什么 。然后形成"参数?appKey=x&a=1&b=2&token=数字签名" 做为请求传入即可。如	public  T getForObject(String url, Class responseType, Map map) throws RestClientException { 		HMAC hmac=new HMAC();     htmc.addParams(map); 		//String timestamp = (new Date()).getTime() + ""; 		htmc.addParam("appKey", key); 		//addParam("timestamp", timestamp); 		String token =hmac. encrypt(); 		hmac.addParam("token", token);     Map params=hmac.getParams(); 		RestTemplate restTemplate = Rest.getInstance().getRestTemplate(); 		for (String p : params.keySet()) { 			url += (url.indexOf("?") == -1 ? "?" + p + "=" + params.get(p) : "&" + p + "=" + params.get(p)); 		}  		return restTemplate.getForObject(url, responseType); 	}
  最后大家可以考虑下,怎么样在里面加上时间校验或者一次性过期验证,以保证收到的信息都是及时的。

近一年基金收益排行榜新能源电池光伏科技芯片霸榜一不要懵懵懂懂地随意买股票,要在投资前扎实地做一些功课,才能成功二从数据中看出乾坤,从干货中寻找股票三低位突破直接进场,涨幅巨大回调30分批进场基金布局一定要均衡才不会踏空定投计划7月新能源销量丨比亚迪持续发力,特斯拉遭遇滑铁卢8月11日,乘联会发布了7月国内汽车市场的零售销量数据。从具体的数据来看,7月份国内乘用车市场销量达150万辆,同比下降6。2,环比下降4。9。在整体市场处于下降的趋势下,发展迅速赛力斯华为智选SF5火爆新能源汽车市场赛力斯华为智选SF5惊艳亮相上海车展后,便受到了广大用户的热烈关注和讨论。由于出色的性能,该车型在市场中十分火热。赛力斯华为智选SF5是赛力斯与华为深度合作,共同推出的量产增程电动华为P50Pro明天1008正式开售黑科技加持6488元起手机中国新闻上月底,华为的新品发布会上,华为P50系列终于如期与大家见面了,黑科技加持的它让不少粉丝都觉得很满意。8月12日1008,华为P50Pro终于要开始首销,售价6488元币圈乞丐竟为黑客出谋划策史上最大黑客事件6。1亿美元是什么概念?如果按照事件发生时相关资产的市场价格计算,这不仅仅是DeFi历史上涉案金额最大的黑客事件,更是整个加密货币历史上涉案金额最大的黑客事件,如果阿里女员工遭侵犯事件她为何敢鱼死网破全网沸腾的女员工被侵犯事件,阿里回应了。8月9日凌晨,阿里巴巴董事会主席兼CEO张勇在内网公布了处理决定涉事男员工曲一(本名王成文)被辞退,永不录用。引发大家强烈不满的是这个词过度阿里性侵事件对企业文化的冷思考事件近日,全网对阿里巴巴女员工遭侵害一事传得沸沸扬扬。8月7日,阿里女员工发文称,27日她陪同上级领导王某前往济南出差,和济南华联的客户开完会后一起吃饭。在饭桌上,她被王某多次劝酒重磅!移远通信推出超小尺寸5G模组RG200U8月11日,移远通信正式推出基于展锐唐古拉5G基带芯片平台V510的超小尺寸5G模组RG200U,相比传统LGA封装5G模组尺寸减小约三分之一。RG200U5G模组在体积上的显著优美军资助的双足机器人自主完成5公里户外跑,用时53分钟据纽约邮报网站报道,俄勒冈州立大学宣布,通过机器学习的自学能力,该校学生制造的一台双足机器人跑完了5公里长的路程。报道称,这台被称为卡西(Cassie)的机器人创造了历史,一次充电在线教育大裁员,突然失业的年轻人还好吗?封面图裁员潮正在席卷整个在线教育行业,总共受波及的员工数量或超过百万。而教培行业的震荡只是万千行业震荡中的一个缩影。身处在一个VUCA(指不稳定不确定复杂模糊的商业格局)时代,我们腾讯阿里用音乐破冰,淘宝支持微信支付还远么?玺承电商(IDxcds)编辑小玺君腾讯和阿里将牵手合作的事情再次登上热榜。此前,就有消息称,阿里巴巴会将腾讯的微信支付引入淘宝和天猫,腾讯将允许阿里巴巴的电商信息分享到微信(或允许
新能源车的续航里程,到底有多大水分?冬季更明显最近祖国大地遭遇了一场寒潮,网上关于新能源车续航的话题层层堆叠。不可否认寒潮对于新能源车的续航存在影响,但是大家有没有想过,厂家标注的续航里程就一定是货真价实的吗?小木查了查资料,关于贷款买车,你需要知道的一些事车辆贷款一般有几种贷款渠道银行信用贷款汽车品牌旗下金融机构贷款第三方金融贷款平台。银行信用贷款申请比较复杂,需要提供很多证明文件,现在使用的相对比较少。汽车品牌旗下金融机构贷款是目市值突破8300亿美元,特斯拉是如何一步步做大的?原因竟是穷最近十几天,小木在网上浏览关于新能源汽车的话题时,出现最多的一个名字,无疑是特斯拉。特斯拉市值突破8300万美元最近十几天,小木在网上浏览关于新能源汽车的话题时,出现最多的一个名字车窗起雾怎么办?这些办法,比较管用冬天一阵阵寒潮,恰逢最近又断断续续下起了雨。想必开车的朋友都会遇到车窗玻璃起雾的情况,这会导致视线受阻往往很容易引起交通事故。那该怎么除雾呢?想要除雾,我们首先得知道车窗起雾的原理这样的实体店,颤抖吧!马上就要收拾你了昨天写了一篇如何成为专家型社群营销文章得到部分粉丝认可,按要求给朋友实体店写一篇童装实体店建群后的运营方案!在此再啰嗦一遍,社群营销建群前必须需要有用户调查用户痛点群内活动等一些策零跑C11一款有备而来的新能源汽车零跑C11来了!杭州举办了零跑C11之夜主题发布会,宣布零跑C11正式上市,售价区间为15。9819。98万元。配置相比预售,新增全系标配前排双层静音玻璃副驾手机投屏棕色内饰选择等从ofo风波到摩拜大规模裁员会是互联网下一个风口预兆吗?2018年互联网不平凡的年份,12月18日,用户因押金难退到ofo总部排队的场景。上午11时许,在大楼南门外看到,约有二百余人在导流护栏里排队。根据网友说线上APP退押金超长时间,社群营销3个阶段让你玩转社群!2019互联网营销模式升级偏向社群裂变,新电商法的执行导致许多中小卖家转型或放弃。社群营销起初来源于微商,社群裂变营销模式成效慢慢延伸到传统电商。但是真正玩转的却没有几个,以下为常眼部保养小对策可能是因为我开始眼部护理比较早,所以虽然已经到了25岁但是眼周的肌肤还是属于比较紧致的那种。我一直认为眼部护理这件事情真的是要未雨绸缪的,不要仗着自己年轻,胶原蛋白比较充足而放纵自生鲜电商长途路漫宝能入局全面深入当前,零售业态早已经过互联网时代的冲刷改变了原本的面貌。资本纷纷布局新零售业态,每个人都在冲浪,有的被拍倒不再,也有新手不断登场。2021年春天的脚步到来时,这个行业迎来了全面铺开华硕VivoBook15轻薄本开售11代酷睿15。6寸大屏伴随着新生代年轻人群陆续步入职场,TA们在选择笔记本电脑时不仅看中性能配置,高颜值机身轻薄设计屏幕素质等同样成为TA们购机考量因素。针对此类用户需求,近日,华硕VivoBook15