簡體   English   中英

如何驗證第三方服務器.net核心上的GKLocalPlayer

[英]How to verify GKLocalPlayer on third party server .net core

我有以下代碼用於驗證GKLocalPlayer:

var cert = await GetCertificate(gameCenter.PublicKeyURL);
if (cert.Verify())
{
    var rsa = cert.GetRSAPublicKey();
    if (rsa != null)
    {
        var sha256 = new SHA256Managed();
        var sig = ConcatSignature(gameCenter.PlayerID, gameCenter.BundleID, gameCenter.TimeStamp, gameCenter.Salt);

        var hash = sha256.ComputeHash(sig);
        if (rsa.VerifyHash(hash, Convert.FromBase64String(gameCenter.Signature), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1))
        {
            return true;
        }
        return false;
    }
}

private async Task<X509Certificate2> GetCertificate(string url)
{
    var client = new HttpClient();
    var response = await client.GetAsync(url);
    var rawData = await response.Content.ReadAsByteArrayAsync();
    return new X509Certificate2(rawData);
}

private byte[] ConcatSignature(string playerId, string bundleId, string timestamp, string salt)
{
    var b = Convert.FromBase64String(salt);

    var data = new List<byte>();
    data.AddRange(Encoding.UTF8.GetBytes(playerId));
    data.AddRange(Encoding.UTF8.GetBytes(bundleId));
    data.AddRange(ToBigEndian(Convert.ToUInt64(timestamp)));
    data.AddRange(Convert.FromBase64String(salt));
    return data.ToArray();
}

private static byte[] ToBigEndian(ulong value)
{
    var buffer = new byte[8];
    for (int i = 0; i < 8; i++)
    {
        buffer[7 - i] = unchecked((byte)(value & 0xff));
        value = value >> 8;
    }
    return buffer;
}

但是當我試圖驗證准確的GameCenter時,這總是返回false。 我瀏覽了所有評論,但我找不到專門針對.net Core和GKLocalPlayer驗證發布的內容。

你的代碼對我有用。 請注意,如果您未在設備上測試它將會失敗(因為數據是時間敏感的)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM