只有累積,沒有奇蹟

2019年6月3日 星期一

[C#] 在 C# 使用 HMAC - SHA256 加密

前言
最近工作上跟第三方服務串接時用到 HMAC - SHA256 加密方式,過去大多是使用 MD5 或是 SHA-256 加密但 HMAC 沒接觸過小研究了一番,HMAC 全名是 Hash-based message authentication code,是一種金鑰式雜湊演算法,可以結合加密金鑰 (key) 進行加密最後輸出 64 字元的內容,對於演算法內容想了解更多可以參考 wiki : 傳送門,這裡就紀錄在 C# 中如何實現 HMAC-SHA256 的加密,若有問題歡迎留言一起討論。

代碼
過去在 C# 實作演算法時都是使用 System.Security.Cryptography 命名空間,HMACSHA256 也不例外可以在此命名空間找到,並提供多載的建構子可以讓開發者選擇金鑰是隨機或是指定方式建立 Instance,不指定金鑰建構式
public HMACSHA256 ();
指定金鑰建構式,傳入 byte 作為參數
public HMACSHA256 (byte[] key);
代碼如下
private static string HMACSHA256(string message, string key)
{
    var encoding = new System.Text.UTF8Encoding();
    byte[] keyByte = encoding.GetBytes(key);
    byte[] messageBytes = encoding.GetBytes(message);
    using (var hmacSHA256 = new HMACSHA256(keyByte))
    {
        byte[] hashMessage = hmacSHA256.ComputeHash(messageBytes);
        return BitConverter.ToString(hashMessage).Replace("-", "").ToLower();
    }
}

驗證結果
來做個簡單的測試,message 帶入"TEST",KEY 帶 "KEY" 觀察輸出為何
HMACSHA256("TEST", "KEY");
// resulg : 615dac1c53c9396d8f69a419a0b2d9393a0461d7ad5f7f3d9beb57264129ef12
驗證正確性可以透過 HMAC Generator 網站,加密方式選擇 HMACSHA256 進行確認
驗證無誤,準備收工 (?
如果希望更方便使用的話,可以使用擴充方法增加方便性

擴充方法
新增 HMACSHA256.cs 並針對 string 加入 HMACSHA256 擴充方法
public static class ExtensionMethods
{
    public static string HMACSHA256(this string message, string key)
    {
        var encoding = new System.Text.UTF8Encoding();
        byte[] keyByte = encoding.GetBytes(key);
        byte[] messageBytes = encoding.GetBytes(message);
        using (var hmacSHA256 = new HMACSHA256(keyByte))
        {
            byte[] hashMessage = hmacSHA256.ComputeHash(messageBytes);
            return BitConverter.ToString(hashMessage).Replace("-", "").ToLower();
        }
    }
}
使用方式如下
static void Main(string[] args)
{
    var result = "TEST".HMACSHA256("KEY");
    Console.WriteLine(result);
}

以上是透過簡單代碼達到實作 HMACSHA256 的代碼,如果想了解更細節的部分推薦參考 Stackoverflow 中 Calculating HMACSHA256 using c# to match payment provider example 的回答內容,可以讓你更加了解,Happy Coding :)

參考

0 意見:

張貼留言

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com