安全性
签名与验签
参数 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))
}