プログラム 技術

C#でHMACアルゴリズムでデータを保護する

前回、SHAについて記事を書きましたが今回はHMACについて書きます

関連記事
C#でSHAアルゴリズムでデータを保護する - ナストンのまとめ
C#でSHAアルゴリズムでデータを保護する - ナストンのまとめ

今回はSHAアルゴリズムを使用してデータ保護します SHAアルゴリズムって何? 本サイトで何度か書いているAESやRSA ...

続きを読む

HMACって何?

ハッシュ関数を利用してメッセージに認証情報を付与するためのアルゴリズムで、秘密鍵を使用してハッシュを計算し、これによりメッセージの整合性を担保するものです。今回はハッシュ関数をSHAで実装します。詳しくは以下のサイトが参考になると思います

参考サイト
HMACとは 認証の仕組みと実装 | Okta
HMACとは 認証の仕組みと実装 | Okta

HMACとは、サイバー攻撃などから保護するために暗号鍵と公開鍵の2つの鍵を使用するメッセージ認証方法の1つです。HMAC ...

続きを読む

元データを暗号化する

「System.Security.Cryptography」クラスには4種類のHMACSHA(HMACSHA1、HMACSHA256、HMACSHA384、HMACSHA512)があり、呼び出すインスタンスを変えるだけでそれ以降は同じ処理となります

public string ComputeHMACSHA1(string message, string secretKey)
{
    using (HMACSHA1 sha1 = new HMACSHA1(Encoding.UTF8.GetBytes(secretKey)))
    {
        byte[] hashBytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(message));
        return BitConverter.ToString(hashBytes).Replace("-", String.Empty);
    }
}

public string ComputeHMACSHA256(string message, string secretKey)
{
    using (HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secretKey)))
    {
        byte[] hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
        return BitConverter.ToString(hashBytes).Replace("-", String.Empty);
    }
}

public string ComputeHMACSHA384(string message, string secretKey)
{
    using (HMACSHA384 hmac = new HMACSHA384(Encoding.UTF8.GetBytes(secretKey)))
    {
        byte[] hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
        return BitConverter.ToString(hashBytes).Replace("-", String.Empty);
    }
}

public string ComputeHMACSHA512(string message, string secretKey)
{
    using (HMACSHA512 hmac = new HMACSHA512(Encoding.UTF8.GetBytes(secretKey)))
    {
        byte[] hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
        return BitConverter.ToString(hashBytes).Replace("-", String.Empty);
    }
}

暗号した値を比較する

今回はSHAで暗号化しているので元の平文に戻せないので、暗号化した者同士で比較をします。大文字小文字を区別しないオプションをつけて実施しています

public bool VerifyHMACSHA1(string message, string hmacResult, string secretKey)
{
    string computedHMAC = ComputeHMACSHA1(message, secretKey);
    return string.Equals(hmacResult, computedHMAC, StringComparison.OrdinalIgnoreCase);
}

public bool VerifyHMACSHA256(string message, string hmacResult, string secretKey)
{
    string computedHMAC = ComputeHMACSHA256(message, secretKey);
    return string.Equals(hmacResult, computedHMAC, StringComparison.OrdinalIgnoreCase);
}

public bool VerifyHMACSHA384(string message, string hmacResult, string secretKey)
{
    string computedHMAC = ComputeHMACSHA384(message, secretKey);
    return string.Equals(hmacResult, computedHMAC, StringComparison.OrdinalIgnoreCase);
}

public bool VerifyHMACSHA512(string message, string hmacResult, string secretKey)
{
    string computedHMAC = ComputeHMACSHA512(message, secretKey);
    return string.Equals(hmacResult, computedHMAC, StringComparison.OrdinalIgnoreCase);
}

実際に動かしてみる

それでは実際に動かして、結果を見てみましょう。対象データを2種類用意して、元データのは「original」、違うデータを「modified」、秘密鍵を「ThisIsASecretKey」としています

会社紹介

私が所属しているアドバンスド・ソリューション株式会社(以下、ADS)は一緒に働く仲間を募集しています

会社概要
「技術」×「知恵」=顧客課題の解決・新しい価値の創造

この方程式の実現はADSが大切にしている考えで、技術を磨き続けるgeekさと、顧客を思うloveがあってこそ実現できる世界観だと思っています
この『love & geek』の精神さえあれば、得意不得意はno problem!
技術はピカイチだけど顧客折衝はちょっと苦手。OKです。技術はまだ未熟だけど顧客と知恵を出し合って要件定義するのは大好き。OKです
凸凹な社員の集まり、色んなカラーや柄の個性が集まっているからこそ、常に新しいソリューションが生まれています

ミッション
私たちは、テクノロジーを活用し、業務や事業の生産性向上と企業進化を支援します

ホームページ
アドバンスド・ソリューション株式会社
アドバンスド・ソリューション株式会社

アドバンスド・ソリューションは主にMicrosoft製品を使用して、企業の生産性向上に取り組んでいます。要件定義から導入 ...

サイトへ移動

お問い合わせ
お問い合わせ  | アドバンスド・ソリューション株式会社
お問い合わせ | アドバンスド・ソリューション株式会社

お問い合わせはこちら

-プログラム, 技術
-