首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java HMAC-SHA256 簽名算法移植到 C# 完整實作

     編輯:程式設計綜合問答

Java 原始碼

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;
}

C# 移植實作

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();
        }
    }
}

關鍵差異說明

  • Java 需先 URLEncoder.encode,C# 範例中未包含此步驟,若原始流程需要 URL 編碼,請在呼叫前自行處理。
  • C# HMACSHA256 直接支援 ComputeHash,無需手動 Initialize。
  • 十六進位格式化:Java 用 Integer.toHexString 補零,C# 用 ToString("x2") 更簡潔。
  • 資源釋放:C# 使用 using 確保 HMACSHA256 正確釋放非託管資源。

驗證建議

使用相同的 sk 與 data,分別在 Java 與 C# 執行,比較輸出簽名是否一致。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved