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¤cy=JPY と currency=JPY&amount=100 は別の署名になります。
HMAC は「改ざん防止」であり「暗号化」ではない
HMAC はメッセージを隠しません。 メッセージを隠したい場合は AES などの暗号化が必要です。
HMAC 署名で絶対にやってはいけないこと
- 秘密鍵を短くする
- 秘密鍵をコードにベタ書きする
- 秘密鍵をログに出力する
- メッセージを正規化せずに署名する
- SHA1 を使う(脆弱)
- HMAC を平文で保存する
これらはすべて重大なセキュリティ事故につながります。
実務的ベストプラクティス
- HMAC-SHA256 を使う
- 秘密鍵は KeyVault や環境変数で管理する
- メッセージを正規化する
- 署名は Base64 または Hex で返す
- HTTPS を必ず使う
- 署名をログに出力しない
まとめ:HMAC 署名生成は「改ざん防止の中心技術」
HMAC 署名生成の本質は次の 3 つです。
- 秘密鍵を使ってメッセージに署名する
- 改ざんされていないことを保証する
- 正しい送信者であることを証明する
これらを正しく実装することで、 攻撃者がメッセージを偽造したり書き換えたりするのを極端に難しくできます。
読者のみなさんが業務システムを開発する際、 このユーティリティを使うだけでセキュリティレベルが大幅に向上し、 ユーザーの安全を確実に守ることができます。
