首页

关于数据接口基于MD5实现的加盐加签的实现调用方身份认证的方法案例分享

标签:md5加盐加签,身份认证,接口数据安全     发布时间:2018-06-05   

一、前言

关于服务提供方在获取消费方调用接口时,需对其调用方(服务消费者)进行第三方身份认证,从而识别其为可信任的系统消费者,进而保证数据安全完整性,下面通过基于md5加盐加签的方式实现接口身份认证代码示例说明。

二、示例说明

1.接口签名方式(消费者私钥:XwoodA1b2c3

1.1对除签名外的所有请求参数按key做的升序排列,value无需编码。@b@  (假设当前时间的时间戳是12345678)@b@例如:有c=3,b=2,a=1 三个参,另加上时间戳后, 按key排序后为:a=1,b=2,c=3,_timestamp=12345678。@b@ @b@1.2 把参数名和参数值连接成字符串,得到拼装字符:a1b2c3_timestamp12345678@b@ @b@1.3 用申请到的appkey 连接到接拼装字符串头部和尾部,然后进行32位MD5加密,最后将到得MD5加密摘要转化成大写。@b@示例:假设appkey=test,md5(testa1b2c3_timestamp12345678test),取得MD5摘要值 C5F3EB5D7DC2748AED89E90AF00081E6 @b@实例:假设appkey= XwoodA1b2c3,md5(XwoodA1b2c3channel2012random12345timestamp1490152940976XwoodA1b2c3),取得MD5摘要值 042C52D802FDFF3AA0CB693AEEF2E5E7

2.注意事项

2.1  参数名ASCII码从小到大排序@b@2.2       如果参数的值为空不参与签名;@b@2.3       参数名区分大小写;@b@2.4       接口可能增加字段,验证签名时必须支持增加的扩展字段。@b@2.5       接口双方必须使用签名校验数据是否完整,若数据不完整,需要记录日志并抛弃此次数据交互。

3.签名代码

import java.security.MessageDigest;@b@ @b@import org.apache.commons.logging.Log;@b@import org.apache.commons.logging.LogFactory;@b@ @b@public class MD5Util {@b@ @b@    protected static Log logger = LogFactory.getLog(MD5Util.class);@b@ @b@    private final static String[] strDigits = { "0", "1", "2", "3", "4", "5",@b@            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };@b@ @b@    private String key;@b@ @b@    // 返回形式为数字跟字符串@b@    private static String byteToArrayString(byte bByte) {@b@        int iRet = bByte;@b@        if (iRet < 0) {@b@             iRet += 256;@b@        }@b@        int iD1 = iRet / 16;@b@        int iD2 = iRet % 16;@b@        return strDigits[iD1] + strDigits[iD2];@b@    }@b@ @b@    // 转换字节数组为16进制字串@b@    private static String byteToString(byte[] bByte) {@b@        StringBuffer sBuffer = new StringBuffer();@b@        for (int i = 0; i < bByte.length; i++) {@b@             sBuffer.append(byteToArrayString(bByte[i]));@b@        }@b@        return sBuffer.toString();@b@    }@b@ @b@    public static String GetMD5Code(String strObj) {@b@        String resultString = null;@b@        try {@b@             resultString = new String(strObj);@b@             MessageDigest md = MessageDigest.getInstance("MD5");@b@             resultString = byteToString(md.digest(strObj.getBytes()));@b@        } catch (Exception ex) {@b@             logger.info("GetMD5Code error for " + strObj, ex);@b@        }@b@        return resultString;@b@    }@b@ @b@    public String getKey() {@b@        return key;@b@    }@b@ @b@    public void setKey(String key) {@b@        this.key = key;@b@    }@b@ @b@    public static void main(String[] args) {@b@        @b@        String ss = MD5Util.GetMD5Code("XwoodA1b2c3channel2012random12345timestamp1490152940976XwoodA1b2c3".toUpperCase()); @b@        System.out.println(ss.toUpperCase());     @b@        @b@    }@b@}
  • ◆ 相关内容