跳到主要内容

安全性

签名与验签

  • 参数 name 按字母升序排序(区分大小写,大写排前面)

  • name1=value1&name2=value2&... 的格式拼接签名源串

  • 对最后拼接的签名源串进行HmacSHA1计算,得到签名

信息
  • 参与签名的参数可能由于版本更新增加,请游戏务必动态获取所有的参数

  • 值为空的参数和 sign 字段本身不参与签名

  • name 和 value 不需要进行任何编码(如不需要URL Encode)

给出进行签名的示例 Java 代码

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class HmacSHA1Encrypt {

private static final String MAC_NAME = "HmacSHA1";

public static String hmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception {
byte[] digest = hmacSHA1EncryptBytes(encryptText, encryptKey);
return bytesToHexString(digest);
}

public static byte[] hmacSHA1EncryptBytes(String encryptText, String encryptKey) throws NoSuchAlgorithmException, InvalidKeyException {
byte[] keyBytes = encryptKey.getBytes(StandardCharsets.UTF_8);
SecretKeySpec secretKey = new SecretKeySpec(keyBytes, MAC_NAME);
Mac mac = Mac.getInstance(MAC_NAME);
mac.init(secretKey);
byte[] textBytes = encryptText.getBytes(StandardCharsets.UTF_8);
return mac.doFinal(textBytes);
}

public static String bytesToHexString(byte[] bytesArray) {
if (bytesArray == null) {
return null;
}
StringBuilder stringBuilder = new StringBuilder();
for (byte b : bytesArray) {
String hexValue = String.format("%02x", b);
stringBuilder.append(hexValue);
}
return stringBuilder.toString();
}
}

给出进行签名的示例 Golang 代码

import (
"crypto/hmac"
"crypto/sha1"
"encoding/hex"
)

func hmacSHA1Encrypt(encryptText string, encryptKey string) string {
h := hmac.New(sha1.New, []byte(encryptKey))
h.Write([]byte(encryptText))
return hex.EncodeToString(h.Sum(nil))
}