public static String genSignature(String sk, String stringToSign) {
String signature = "";
try {
String encodedSign = URLEncoder.encode(stringToSign, ENCODING);
try {
Mac mac = Mac.getInstance(HASH);
mac.init(new SecretKeySpec(sk.getBytes(ENCODING), HASH));
byte[] hashData = mac.doFinal(encodedSign.getBytes(ENCODING));
StringBuilder sb = new StringBuilder(hashData.length * 2);
for (byte data : hashData) {
String hex = Integer.toHexString(data & 0xFF);
if (hex.length() == 1) sb.append("0");
sb.append(hex);
}
signature = sb.toString().toLowerCase();
} catch (Exception e) { /* log */ }
} catch (UnsupportedEncodingException e) { /* log */ }
return signature;
}
using System;
using System.Security.Cryptography;
using System.Text;
public static class SignatureHelper
{
private const string ENCODING = "UTF-8";
private const string HASH = "HmacSHA256";
public static string GenSignature(string sk, string data)
{
var enc = new UTF8Encoding();
byte[] secretKey = enc.GetBytes(sk);
using (var hmac = new HMACSHA256(secretKey))
{
byte[] bytes = enc.GetBytes(data);
byte[] hashBytes = hmac.ComputeHash(bytes);
var sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
string hex = (hashBytes[i] & 0xFF).ToString("x2"); // 直接兩位十六進位
sb.Append(hex);
}
return sb.ToString().ToLower();
}
}
}
URLEncoder.encode,C# 範例中未包含此步驟,若原始流程需要 URL 編碼,請在呼叫前自行處理。HMACSHA256 直接支援 ComputeHash,無需手動 Initialize。Integer.toHexString 補零,C# 用 ToString("x2") 更簡潔。using 確保 HMACSHA256 正確釋放非託管資源。使用相同的 sk 與 data,分別在 Java 與 C# 執行,比較輸出簽名是否一致。