接口通信(通信协议/通信安全) ------R

一 : 1.通信协议: 采用HTTP协议进行请求和响应的处理。接口请求采用POST方式,接口响应返回JSON格式的数据。

       2.	接口未注明处均使用UTF-8编码。
       3.	接口请求需进行签名

二 : 通信安全:
1. 为保证数据传输过程中的数据完整性和真实性,接入商需要对数据进行数字签名,我方接收签名数据后进行签名校验,默认签名算法为MD5。
MD5 : (MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。).
2.接入商接入时,平台(我方系统)会为接入商分配唯一的平台商户号subscriberCode、用户名loginUsername、密码loginPwd、对应MD5私钥内容。签名机制如下流程:
a . 将完整的请求报文体使用MD5秘钥进行签名(签名原文为请求body在Json序列化后的UTF8编码得到的字节流,详情见demo示例),将签名后得到的字节数组以base64编码方式得到的字符串值通过sign的值传递。也就是将body中的参数加上我方给的MD5私钥进行参数签名 得到的签名串当作sign的值进行传递。
b. 我方接受到签名后 对签名进行验签 。验签逻辑同签名逻辑,即取出报文中的sign的值(作为签名),然后取出请求报文的body内容进行验证签名。也就是拿MD5私钥和请求的参数进行验证签名 。如果验签生成的sign和请求传入的sign一致则验签成功。(注意: 双方的私钥是一致的)。

三 : MD5加签解签代码 :

package com.zhonguo.zhuboyuan.good.springboot.service.md5;


import java.security.MessageDigest;


/**
 * MD5工具类
 *
 * @author
 * @date 2018/5/11 上午6:32
 */
public class Md5Util {
	 public static final String UTF8_CHARSET = "UTF-8";

    /**
     *
     * 全局数组
     */
    private final static String[] STR_DIGITS = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};


    public static String encrypt32(String strObj) {
        String resultString = null;
        try {
            resultString = new String(strObj);
            MessageDigest md = MessageDigest.getInstance("MD5");
            // md.digest() 该函数返回值为存放哈希值结果的byte数组
            resultString = byteToString(md.digest(strObj.getBytes(UTF8_CHARSET)));
        } catch (Exception ex) {
          //  log.error("异常:{}", ex);
        }
        return resultString;
    }

    public static String encrypt32Up(String strObj, String privateKey) {
        return encrypt32(strObj + privateKey).toUpperCase();
    }

    /**
     * 转换字节数组为16进制字串
     *
     * @param bByte
     * @return
     */
    private static String byteToString(byte[] bByte) {
        StringBuffer sBuffer = new StringBuffer();
        for (int i = 0; i < bByte.length; i++) {
            sBuffer.append(byteToArrayString(bByte[i]));
        }
        return sBuffer.toString();
    }

    /**
     * 返回形式为数字跟字符串
     *
     * @param bByte
     * @return
     */
    private static String byteToArrayString(byte bByte) {
        int iRet = bByte;
        if (iRet < 0) {
            iRet += 256;
        }
        int iD1 = iRet / 16;
        int iD2 = iRet % 16;
        return STR_DIGITS[iD1] + STR_DIGITS[iD2];
    }
}

package com.zhonguo.zhuboyuan.good.springboot.service.md5;


import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Slf4j
public class SignUtil {
	 public static final String SIGN_STRING = "sign";
	 /** 拼接字符串 */
	 public static final String AND = "&";
  


    /**
     * 生成MD5加密字符串
     *
     * @param reqObj     请求参数
     * @param privateKey 密钥信息
     * @return
     */
    public static String genMd5Sign(JSONObject reqObj, String privateKey) {
        // 生成待签名串
        String signSrc = genSignData(reqObj);
       // log.info("待签名原串为:{}", signSrc);
        System.out.println("待签名原串为"+signSrc);
        try {
            return Md5Util.encrypt32Up(signSrc, privateKey);
        } catch (Exception ex) {
           // log.error("生成签名字符串异常,异常信息为:{}", ex);
        }
        return null;
    }

   

    /**
     * MD5验签
     *
     * @param reqObj     请求参数
     * @param privateKey 密钥字符串
     * @return
     */
    public static boolean verifyByMd5(JSONObject reqObj, String privateKey) {
        boolean verifyResult = false;
        // 生成待签名串
        String signSrc = genSignData(reqObj);
     //   log.info("待签名原串为:{}", signSrc);
        try {
            String sign = Md5Util.encrypt32Up(signSrc, privateKey);
            log.info("验签生成的sign :" +sign);
            log.info("获取请求的sign :" + reqObj.getString(SIGN_STRING));
            verifyResult = reqObj.getString(SIGN_STRING).equals(sign);
        } catch (Exception ex) {
         //   log.error("MD5验签异常, 异常信息为:{}", ex);
        }
        return verifyResult;
    }

    /**
     * 生成待签名串
     *
     * @param jsonObject
     * @return
     */
    public static String genSignData(JSONObject jsonObject) {
        StringBuffer content = new StringBuffer();
        // 按照key做首字母升序排列
        List<String> keys = new ArrayList<>(jsonObject.keySet());
        Collections.sort(keys, String.CASE_INSENSITIVE_ORDER);
        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            // sign 不参与签名
            if (SIGN_STRING.equals(key)) {
                continue;
            }
            String value = jsonObject.getString(key);
            // 空串不参与签名
            if (StringUtils.isEmpty(value)) {
                continue;
            }
            content.append((i == 0 ? "" : AND) + key + "=" + value);
        }
        String signSrc = content.toString();
        if (signSrc.startsWith(AND)) {
            signSrc = signSrc.replaceFirst(AND, "");
        }
        return signSrc;
    }

   



    private static void md5() {
    	JSONObject jsonObject=new JSONObject();
        String MD5_PRIVATE_KEY = "ADANBgkqhkiG9w0BAQEFAAS";
        String sign = genMd5Sign(jsonObject, MD5_PRIVATE_KEY);
        System.out.println("sign字符串:" + sign);
        jsonObject.put("sign", sign);
        System.out.println("MD5验签结果:" + verifyByMd5(jsonObject, MD5_PRIVATE_KEY));

    }

    //
   /* public static void main(String[] args) {
        //私钥
        String RSA_PRIVATE_KEY ="SDGPEWORGJKPROEWJGPREOJGPOERJGPOERGJPOREJGPERGKWFKS";
        //生成SignedMsg的值
        genMd5Sign();
    }*/




    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值