using System.Security.Cryptography; using System.Text; namespace Common.Notify { /// /// IM 机器人 Webhook 加签工具(钉钉/飞书) /// 供 IOT_API 直连推送与 AlertBridge 跨网转发程序共用,保证两种模式签名算法一致 /// public static class ImWebhookSigner { /// /// 钉钉机器人加签:sign = UrlEncode(Base64(HmacSHA256(timestamp + "\n" + secret, key=secret))) /// /// 毫秒时间戳 /// 加签密钥(SEC 开头) /// URL 编码后的签名 public static string DingTalkSign(long timestampMs, string secret) { string stringToSign = $"{timestampMs}\n{secret}"; using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret)); byte[] signData = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)); return Uri.EscapeDataString(Convert.ToBase64String(signData)); } /// /// 飞书机器人加签:sign = Base64(HmacSHA256(空串, key=timestamp + "\n" + secret)) /// 注意与钉钉相反:飞书以"时间戳\n密钥"为 key、对空内容签名 /// /// 秒级时间戳 /// 加签密钥 /// Base64 签名 public static string FeishuSign(long timestampSec, string secret) { using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes($"{timestampSec}\n{secret}")); byte[] signData = hmac.ComputeHash(Array.Empty()); return Convert.ToBase64String(signData); } } }