拼接字符串需注意:
● 参数名和参数值请勿进行urlencode。
● 参数值必须与响应消息中的实际参数值保持一致。
在接口调用过程中,请求方在获取接收方的响应结果后,如果响应结果中包含了接收方返回的签名字符串,请求方可以对签名字符串进行验签,确认响应结果是否被篡改,保证接口调用的安全性。
1、获取返回结果中的签名字符串,即校验登录签名接口返回的rtnSign字段。
2、将返回参数中rtnCode和ts参数,按参数名首字母的ASCII码将参数升序排序。
3、排序完成之后,将所有参与签名的参数名和参数值的键值对以“&”字符连接成字符串,例如“rtnCode=xxxxxx&ts=xxxxxxx”。
4、使用游戏公钥对待验签字符串和响应消息的签名字符串进行验证。
JAVA示例代码如下:
- /**
- * 校验签名信息
- * @param content 待校验字符串
- * @param sign 签名字符串
- * @param publicKey 公钥
- * @param signType 加密类型
- * @param 是否校验通过
- */
- public static boolean doCheck(String content, String sign, String publicKey, String signtype) {
- try {
- KeyFactory keyFactory = KeyFactory.getInstance("RSA");
- byte[] encodedKey = decoder.decode(publicKey);
- PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
- java.security.Signature signature = null;
- if ("RSA256".equals(signtype)) {
- signature = java.security.Signature.getInstance(SIGN_ALGORITHMS256);
- } else {
- signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
- }
- signature.initVerify(pubKey);
- signature.update(content.getBytes("utf-8"));
- boolean bverify = signature.verify(decoder.decode(sign));
- return bverify;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return false;
- }