应用在调用校验登录签名接口时,为了确保HTTPS传输的安全性,防止请求参数被篡改,应用需要在请求时携带请求参数的签名字符串,用于华为游戏服务器对请求参数进行校验。签名字符串的生成规则如下所示:
1、将请求参数中需要参与签名的参数,按参数名首字母的ASCII码将参数升序排序,若遇到相同首字母,则比较第二个字母,以此类推。
需要参与签名的参数是指接口说明中“是否参与签名”列为“是”且实际请求中携带了该参数,并且参数值不为空(null或"")。
2、将所有排序后的参数的参数值进行urlencode。
3、将所有参与签名的参数名和参数值(urlencode后)的键值对以“&”字符连接成待签名字符串,例如“a=xxxxxx&b=xxxxxxx&c=xxxxxxxxxxx...”。
生成待签名字符串的JAVA示例代码如下:
- private static String format(Map<String, String> params)
- {
- StringBuffer base = new StringBuffer();
- Map<String, String> tempMap = new TreeMap<String, String>(params);
- //获取计算nsp_key的基础串
- try
- {
- for (Map.Entry<String, String> entry : tempMap.entrySet())
- {
- String k = entry.getKey();
- String v = entry.getValue();
- base.append(k).append("=").append(URLEncoder.encode(v, "UTF-8")).append("&");
- }
- }
- catch (UnsupportedEncodingException e)
- {
- System.out.println("Encode parameters failed.");
- e.printStackTrace();
- }
- String body = base.toString().substring(0, base.toString().length() - 1);
- // 空格和星号转义
- body = body.replaceAll("\\+", "%20").replaceAll("\\*", "%2A");
- return body;
- }
4、将待签名字符串使用游戏私钥按照RSA算法(SHA256WithRSA)进行签名,将签名后的字符串经过Base64编码,得到的字符串即为签名字符串。
JAVA示例代码如下:
- private static String generateCPSign(Map<String,String> requestParams,final String cpAuthKey)
- {
- //对消息体中查询字符串按字典序排序并且进行URLCode编码
- String baseStr = format(requestParams);
- //用CP侧签名私钥对上述编码后的请求字符串进行签名
- String cpSign = sign(baseStr.getBytes(Charset.forName("UTF-8")), cpAuthKey);
- return cpSign;
- }
- private static String sign(byte[] data, String privateKey)
- {
- try
- {
- byte[] e = Base64.decodeBase64(privateKey);
- PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(e);
- KeyFactory keyFactory = KeyFactory.getInstance("RSA");
- PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
- Signature signature = Signature.getInstance("SHA256WithRSA");
- signature.initSign(privateK);
- signature.update(data);
- String signs = Base64.encodeBase64String(signature.sign());
- return signs;
- }
- catch (Exception var)
- {
- System.out.println("SignUtil.sign error." + var);
- return "";
- }
- }