目录

在接口调用过程中,请求方在获取接收方的响应结果后,如果响应结果中包含了接收方返回的签名字符串,请求方可以对签名字符串进行验签,确认响应结果是否被篡改,保证接口调用的安全性。

1、获取返回结果中的签名字符串,即校验登录签名接口返回的rtnSign字段。

2、将返回参数中rtnCode和ts参数,按参数名首字母的ASCII码将参数升序排序。

3、排序完成之后,将所有参与签名的参数名和参数值的键值对以“&”字符连接成字符串,例如“rtnCode=xxxxxx&ts=xxxxxxx”。

注意:
拼接字符串需注意:
● 参数名和参数值请勿进行urlencode。
● 参数值必须与响应消息中的实际参数值保持一致。

4、使用游戏公钥对待验签字符串和响应消息的签名字符串进行验证。

说明:
游戏公钥在开通游戏服务后生成,查询方法参见查询游戏服务信息。

JAVA示例代码如下:

  1. /**
  2. * 校验签名信息
  3. * @param  content 待校验字符串
  4. * @param sign  签名字符串
  5. * @param publicKey 公钥
  6. * @param signType 加密类型
  7. * @param 是否校验通过
  8. */
  9. public static boolean doCheck(String content, String sign, String publicKey, String signtype) {
  10.   try {
  11.      KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  12.      byte[] encodedKey = decoder.decode(publicKey);
  13.      PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
  14.      java.security.Signature signature = null;
  15.      if ("RSA256".equals(signtype)) {
  16.        signature = java.security.Signature.getInstance(SIGN_ALGORITHMS256);
  17.      } else {
  18.        signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
  19.      }      
  20.      signature.initVerify(pubKey);
  21.      signature.update(content.getBytes("utf-8"));
  22.      boolean bverify = signature.verify(decoder.decode(sign));
  23.      return bverify;
  24.   } catch (Exception e) {
  25.      e.printStackTrace();
  26.   }
  27.   return false;
  28. }