签名校验 + 心跳机制,完整客户端实现
heart=1 的使用示例。
以下 KamiClient 类封装了卡密验证的核心逻辑,支持异步调用,可直接集成到您的 .NET 项目中。
// C# 卡密验证客户端(.NET Standard 2.0+) using System; using System.Net.Http; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; public class KamiClient { private readonly string _baseUrl; private readonly string _app; private readonly string _signKey; public KamiClient(string userName, string app, string signKey) { _baseUrl = $"https://www.keyt.cn/kami/{userName}/check.php"; _app = app; _signKey = signKey; } private string Md5(string input) { using var md5 = MD5.Create(); var bytes = Encoding.UTF8.GetBytes(input); var hash = md5.ComputeHash(bytes); return BitConverter.ToString(hash).Replace("-", "").ToLower(); } private string VerifyResponse(string raw) { if (!raw.Contains("|sign=")) return null; var parts = raw.Split(new[] { "|sign=" }, StringSplitOptions.None); var body = parts[0]; var sign = parts[1]; var localSign = Md5(body + _signKey); if (localSign != sign) return null; var lastPipe = body.LastIndexOf('|'); if (lastPipe == -1) return null; var tsStr = body.Substring(lastPipe + 1); if (!long.TryParse(tsStr, out var ts)) return null; var nowTs = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); if (Math.Abs(nowTs - ts) > 120) return null; return body.Substring(0, lastPipe); } public async Task<string> VerifyCardAsync(string card, string mac) { var url = $"{_baseUrl}?card={card}&mac={mac}&app={_app}&heart=1&t={DateTimeOffset.UtcNow.ToUnixTimeSeconds()}"; using var client = new HttpClient(); var resp = await client.GetStringAsync(url); return VerifyResponse(resp); } }
Md5(body + _signKey) 确保响应未被篡改。heart=1 参数,用于保持会话活跃(具体逻辑依后端配置)。VerifyCardAsync 方法支持 async/await,适合 UI 或服务端编程。 提示: 使用前请将 userName、app 和 signKey 替换为后台分配的实际值。完整对接流程请参考 文档首页。