前言
项目开发过程中,难免会接触到接口验签,下面是我个人对验签的一些理解以及处理思路
一、何为验签?
接口双方为了确保数据参数在传输过程中未经过篡改,都需要对接口数据进行加签,然后在接口服务器端对接口参数进行验签,确保两个签名是一样的,验签通过之后再进行业务逻辑处理
二、处理思路
双方约定好,参数按特定顺序排列,比如按首字母的顺序排列,如url:http://xxx/xxx.do?a=wersd&b=sd2354&c=4&signature=XXXXXXXXXXXX(signature为传入的签名),等你拿到入参后,将参数串a=wersd&b=sd2354&c=4按你们约定的签名规则,自己用md5加签一次,然后和入参的signature值对比,以确认调用者是否合法,这就是接口签名验证的思路。
三、java生成签名的工具类
package com.man4fun.mini.util;import java.io.UnsupportedEncodingException;import java.util.Arrays;import java.util.Map;import org.apache.commons.codec.digest.DigestUtils;publicclassSignatureUtil{/**
* 生成签名信息
*
* @param secretKey
* 产品私钥
* @param params
* 接口请求参数名和参数值map,不包括signature参数名
* @return
* @throws UnsupportedEncodingException
*/publicstatic StringgenSignature(String secretKey,
Map<String, Object> params)throws UnsupportedEncodingException{// 1. 参数名按照ASCII码表升序排序
String[] keys= params.keySet().toArray(newString[0]);
Arrays.sort(keys);// 2. 按照排序拼接参数名与参数值
StringBuffer paramBuffer=newStringBuffer();for(String key: keys){
paramBuffer.append(key).append(
params.get(key)== null?"": params.get(key).toString());}// 3. 将secretKey拼接到最后
paramBuffer.append(secretKey);// 4. MD5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。return DigestUtils.md5Hex(paramBuffer.toString().getBytes("UTF-8"));}}
总结
验签只能防止数据传输过程中数据不被篡改噢,并不能保证消息的安全性,要想保证消息的安全性还是需要对消息进行加密的,如果大家觉得这篇博客大家有帮助的话,麻烦点赞噢!