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

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

HMACって何?

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

元データを暗号化する

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

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