C# Tips | セキュリティ:HMAC署名を生成する

C# C#
スポンサーリンク
スポンサーリンク

HMAC 署名を生成することは「データ改ざん防止の基盤となる重要なセキュリティ技術」です

業務システムや Web API を開発する読者のみなさんにとって、 HMAC(Hash-based Message Authentication Code)署名を安全に生成することは必須のセキュリティ要件です。

HMAC は次のような場面で使われます。

  • API リクエストの署名
  • Webhook の署名検証
  • 外部サービス連携のセキュリティ強化
  • メッセージの改ざん防止
  • JWT の署名(HS256 など)

ここでは、初心者でも理解できるように ステップバイステップで思考しながら、 実務で使える C# の HMAC 署名生成ユーティリティを丁寧に解説します。

HMAC 署名とは何か

HMAC の目的

HMAC は「秘密鍵を使ってメッセージに署名する」仕組みです。

目的は次の 2 つです。

  • メッセージが改ざんされていないことを保証する
  • メッセージが正しい送信者によって作られたことを保証する

HMAC の仕組み

HMAC は次の材料で作られます。

  • メッセージ(例:JSON、文字列、URL)
  • 秘密鍵(共有鍵)
  • ハッシュアルゴリズム(SHA256 など)

HMAC の代表的なアルゴリズム:

  • HMAC-SHA256
  • HMAC-SHA384
  • HMAC-SHA512

HMAC が使われる実務例

  • Stripe、PayPal、LINE、Slack などの Webhook 署名
  • API リクエストの署名
  • JWT の HS256 署名
  • メッセージの改ざん防止
  • IoT デバイスの通信署名

HMAC 署名生成のステップ(初心者向けにかみ砕く)

Step 1:秘密鍵を準備する

秘密鍵は十分に長く、ランダムである必要があります。

Step 2:署名したいメッセージを決める

例:JSON、URL、クエリ文字列など。

Step 3:HMAC アルゴリズムを選ぶ

一般的には HMAC-SHA256 を使います。

Step 4:署名を生成する

C# の HMACSHA256 クラスを使います。

実務で使える HMAC 署名生成ユーティリティ(テンプレート)

using System;
using System.Security.Cryptography;
using System.Text;

public static class HmacUtility
{
    /// <summary>
    /// HMAC-SHA256 署名を生成します。
    /// </summary>
    public static string GenerateHmacSha256(string message, string secretKey)
    {
        var keyBytes = Encoding.UTF8.GetBytes(secretKey);
        var messageBytes = Encoding.UTF8.GetBytes(message);

        using var hmac = new HMACSHA256(keyBytes);
        var hashBytes = hmac.ComputeHash(messageBytes);

        return Convert.ToBase64String(hashBytes);
    }

    /// <summary>
    /// Hex 形式の HMAC-SHA256 署名を生成します。
    /// </summary>
    public static string GenerateHmacSha256Hex(string message, string secretKey)
    {
        var keyBytes = Encoding.UTF8.GetBytes(secretKey);
        var messageBytes = Encoding.UTF8.GetBytes(message);

        using var hmac = new HMACSHA256(keyBytes);
        var hashBytes = hmac.ComputeHash(messageBytes);

        return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
    }
}
C#

HMAC 署名生成の使い方(実務コード例)

string secretKey = "your-very-strong-secret-key";
string message = "amount=100¤cy=JPY";

string signature = HmacUtility.GenerateHmacSha256(message, secretKey);
Console.WriteLine(signature);

string hexSignature = HmacUtility.GenerateHmacSha256Hex(message, secretKey);
Console.WriteLine(hexSignature);
C#

HMAC の深掘り(重要ポイント)

秘密鍵は十分に長くする

短い鍵は総当たり攻撃に弱いです。

推奨:32〜64 バイト以上 生成方法:暗号学的乱数

メッセージは必ず「正規化」する

API 署名では、メッセージの順番が変わると署名が一致しません。

例: amount=100&currency=JPYcurrency=JPY&amount=100 は別の署名になります。

HMAC は「改ざん防止」であり「暗号化」ではない

HMAC はメッセージを隠しません。 メッセージを隠したい場合は AES などの暗号化が必要です。

HMAC 署名で絶対にやってはいけないこと

  • 秘密鍵を短くする
  • 秘密鍵をコードにベタ書きする
  • 秘密鍵をログに出力する
  • メッセージを正規化せずに署名する
  • SHA1 を使う(脆弱)
  • HMAC を平文で保存する

これらはすべて重大なセキュリティ事故につながります。

実務的ベストプラクティス

  • HMAC-SHA256 を使う
  • 秘密鍵は KeyVault や環境変数で管理する
  • メッセージを正規化する
  • 署名は Base64 または Hex で返す
  • HTTPS を必ず使う
  • 署名をログに出力しない

まとめ:HMAC 署名生成は「改ざん防止の中心技術」

HMAC 署名生成の本質は次の 3 つです。

  • 秘密鍵を使ってメッセージに署名する
  • 改ざんされていないことを保証する
  • 正しい送信者であることを証明する

これらを正しく実装することで、 攻撃者がメッセージを偽造したり書き換えたりするのを極端に難しくできます。

読者のみなさんが業務システムを開発する際、 このユーティリティを使うだけでセキュリティレベルが大幅に向上し、 ユーザーの安全を確実に守ることができます。

タイトルとURLをコピーしました