Java接口请求加密验签处理

 Java接口请求加密验签处理

最近做了一个接口的加密验签的功能,今天和大家分享一下
***注(以下出现的参数字符串都是测试处理,方便大家理清思路,非真实正确的数据)***

1、参数说明

  字段名称:appcode(产品编码)、servercode(业务编码)、redirect(业务跳转地址)、timestamp(时间)、addParas(附属参数)、sign(签名)。

2、sign签名计算规则
采用md5加密方法,参与计算的参数为上述的appcode、servercode、redirectURL、timestamp、addParas。

3、加密策略
秘钥:XA12#Da

3.1、所有参数组成字符串params
appcode=hsh&servercode=HSH_MMS,hsh10120013,HSH_05_MMS&redirectURL=hsh.12580.com&timestamp=20200220112501&addParas={datasource:163__table}

3.2、将所有参数组成字符串按照字典序排序形成sortParams(即字符串string1)
Map<String, String> sortParams = new TreeMap<String, String>(params);
addParas={datasource:163__table}&appcode=hsh&redirectURL=hsh.12580.com&servercode=HSH_MMS,hsh10120013,HSH_05_MMS&timestamp=20200220112501

3.3、将上述字符串(string1) + 秘钥生成新的字符串(即string2)
addParas={datasource:163__table}&appcode=hsh&redirectURL=hsh.12580.com&servercode=HSH_MMS,hsh10120013,HSH_05_MMS&timestamp=20200220112501&appkey=XA89aD#a

3.4、将string2进行md5生成sign签名
md5(string2)

4、组合参数

4.1、将上述MD5计算的sign值和所有参数addParas、appcode、redirectURL、servicecode、timestamp组合成字符串
"addParas={\"datasource\":\"163__table\"}&appcode=hsh&redirectURL=hsh.12580.com&servercode=HSH_MMS,hsh10120013,HSH_05_MMS&timestamp=20200220112501&sign=4bb716352db6400bc1c8ec9f01424ee0"

4.2、将上述字符串使用base64Util进行加密得到密文然后传输
YWRkUGFyYXM9eyJkYXRhc291cmNlIjoiMTYzX190YWJsZSJ9JmFwcGNvZGU9aHNoJmlmU3Vic2NyaWJlPTEmcmVkaXJlY3RVUkw9aHNoLjEyNTgwLmNvbSZzZXJ2ZXJjb2RlPUhTSF9NTVMsaHNoMTAxMjAwMTMsSFNIXzA1X01NUyZ0aW1lc3RhbXA9MjAyMDAyMjAxMTI1MDEmc2lnbj00YmI3MTYzNTJkYjY0MDBiYzFjOGVjOWYwMTQyNGVlMA==

5、接收方处理

1、现将url后面的加密参数进行base64解密处理

2、解密处理后得到所有的参数(appcode、servercode、redirectURL、timestamp、addParas、sign)

3、将参数(appcode、servercode、redirectURL、timestamp、addParas)进行上述第三步的加密处理生成新的sign值

4、校验解密后sign值和获取参数生成的新sign值做出判断是否相等

 

下面是一个Java实现接口验签的示例代码: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Map; public class SignUtil { /** * 对请求参数进行签名 * @param params 请求参数 * @param secretKey 秘钥 * @return 签名字符串 */ public static String sign(Map<String, String> params, String secretKey) { StringBuilder sb = new StringBuilder(); for (String key : params.keySet()) { sb.append(key).append("=").append(params.get(key)).append("&"); } sb.append("secretKey=").append(secretKey); try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] bytes = md.digest(sb.toString().getBytes()); StringBuilder result = new StringBuilder(); for (byte b : bytes) { String hex = Integer.toHexString(b & 0xff); if (hex.length() == 1) { result.append("0"); } result.append(hex); } return result.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } /** * 验证签名是否正确 * @param params 请求参数 * @param sign 签名字符串 * @param secretKey 秘钥 * @return 验证结果 */ public static boolean verify(Map<String, String> params, String sign, String secretKey) { String newSign = sign(params, secretKey); return sign.equals(newSign); } public static void main(String[] args) { Map<String, String> params = new HashMap<>(); params.put("userId", "123456"); params.put("amount", "100"); String secretKey = "123456"; String sign = sign(params, secretKey); System.out.println("签名字符串:" + sign); boolean verifyResult = verify(params, sign, secretKey); System.out.println("验签结果:" + verifyResult); } } ``` 在上述代码中,`sign`方法实现了对请求参数的签名生成,`verify`方法实现了签名的验证,其中使用了MD5算法进行签名的生成。 具体实现中,首先将请求参数按照“参数名=参数值”的方式拼接成一个字符串,并在字符串末尾添加上秘钥,然后使用MD5算法对该字符串进行加密,生成签名字符串。在验签时,再次使用相同的方式生成签名字符串,并将生成的签名字符串与请求时发送的签名字符串进行比对,以此来判断请求是否合法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值