プログラム 技術

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」としています

-プログラム, 技術
-