登录验证
登录数据验证
OmniSDK 客户端登录成功后,会给游戏客户端传递登录参数以及校验参数
游戏客户端需将参数传递给游戏服务器,并由游戏服务器进行本地校验。
校验规则
参与校验额字段均由 OmniSDK 传递给游戏客户端
- appId: OmniSDK 分配给游戏的 APP ID
- uid:OmniSDK 传递给游戏客户端的用户 uid
- verifyTimestamp:OmniSDK 传递给游戏客户端的时间戳
将上述三个字段按照如下规则进行整合 appId=10032&uid=jinshan__s7di8qcd134eft__EXP.&verifyTimestamp=123456789
使用 HmacSHA1
进行计算,得到的 string value 与 signature
字段一致,则认为验证成功。
提示
进行 HmacSHA1
时使用由 OmniSDK 分配给游戏的服务端 key。
示例代码
部分引用代码详见安全性
给出进行签名的示例 Java 代码
进行签名的示例 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 Example {
private static final String MAC_NAME = "HmacSHA1";
public static boolean compareSignature() {
String signature = "48661382c9e1bb495291a4e7b1be9fa88e7b0c05";
return signature.equals(getSignature("10032", "jinshan__s7di8qcd134eft__EXP.", "123456789"));
}
public static String getSignature(String appId, String uid, String timestamp) {
try {
String serverKey = "aca57f8a6c494a36a516e5c282c4db87";
String signParam = String.format("appId=%s&uid=%s&verifyTimestamp=%s", appId, uid, timestamp);
return hmacSHA1Encrypt(signParam, serverKey);
} catch (Exception e) {
// Do something
}
return "";
}
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 代码
进行签名的示例 Golang 代码
import (
"crypto/hmac"
"crypto/sha1"
"encoding/hex"
"fmt"
"log/slog"
)
func getSignature(appId string, uid string, timestamp string) string {
serverKey := "aca57f8a6c494a36a516e5c282c4db87"
signParam := fmt.Sprintf("appId=%s&uid=%s&verifyTimestamp=%s", appId, uid, timestamp)
return hmacSHA1Encrypt(signParam, serverKey)
}
func hmacSHA1Encrypt(encryptText string, encryptKey string) string {
h := hmac.New(sha1.New, []byte(encryptKey))
h.Write([]byte(encryptText))
return hex.EncodeToString(h.Sum(nil))
}
func compareSignature() bool {
signature := "48661382c9e1bb495291a4e7b1be9fa88e7b0c05"
return signature == getSignature("10032", "jinshan__s7di8qcd134eft__EXP.", "123456789")
}
示例参数
请求签名原始字符串
appId=10032&uid=jinshan__s7di8qcd134eft__EXP.&verifyTimestamp=123456789
Server Key
aca57f8a6c494a36a516e5c282c4db87
Signature 计算结果
48661382c9e1bb495291a4e7b1be9fa88e7b0c05