【C#】SHA256を使用してデータのハッシュ値を計算する

目次

概要

任意の文字列やデータから、SHA256アルゴリズムを使用して固定長のハッシュ値(メッセージダイジェスト)を生成する実装です。 ハッシュ値はデータの改ざん検知や同一性確認に利用され、元のデータが1ビットでも異なれば全く異なる値が出力される特性を持ちます。ここではモダンな .NET 環境で推奨されるファクトリメソッド Create() を使用します。

仕様(入出力)

  • 入力: 任意の文字列(UTF-8エンコーディングを想定)
  • 出力: ハッシュ値の Base64 文字列表現
  • 特性: 同じ入力からは常に同じ出力が得られるが、出力から入力を復元することはできない(不可逆性)。

基本の使い方

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

var data = Encoding.UTF8.GetBytes("Check Integrity");

// アルゴリズムのインスタンス生成
using var sha256 = SHA256.Create();

// ハッシュ計算
byte[] hashBytes = sha256.ComputeHash(data);

// 文字列化(Base64)
var result = Convert.ToBase64String(hashBytes);

コード全文

コンソールアプリケーションとしてそのまま実行可能なコードです。

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

class Program
{
    static void Main()
    {
        // 1. ハッシュ化対象のデータ
        string sourceText = "Security is essential.";
        Console.WriteLine($"[Source] {sourceText}");

        // 2. バイト配列への変換
        // 一般的にWebやデータベース保存ではUTF-8が使用されます
        byte[] sourceBytes = Encoding.UTF8.GetBytes(sourceText);

        // 3. ハッシュアルゴリズムの生成
        // "new SHA256Managed()" ではなく "SHA256.Create()" を使用するのが推奨されます。
        // OSごとの最適な実装(FIPS準拠など)が自動的に選択されるためです。
        using var algorithm = SHA256.Create();

        // 4. ハッシュ値の計算
        // 戻り値は常に32バイト(256ビット)の配列になります
        byte[] hashValue = algorithm.ComputeHash(sourceBytes);

        // 5. 結果の表示
        // Base64形式で表示(短く表現できるため)
        Console.WriteLine($"[Hash (Base64)] {Convert.ToBase64String(hashValue)}");

        // 16進数形式で表示(一般的によく見られる形式、BitConverterを使用)
        string hexString = BitConverter.ToString(hashValue).Replace("-", "").ToLower();
        Console.WriteLine($"[Hash (Hex)]    {hexString}");
    }
}

カスタムポイント

  • アルゴリズムの変更: より高速な MD5(セキュリティ用途では非推奨)や、より強固な SHA512 を使用する場合は、SHA256.Create() の部分を MD5.Create()SHA512.Create() に置き換えるだけで対応可能です。
  • 出力形式: システム間の連携仕様に合わせて、Convert.ToBase64String(Base64)か BitConverter(16進数)かを選択してください。
  • エンコーディング: Windowsアプリ内部のデータなど、UTF-16を使用している場合は Encoding.Unicode.GetBytes を使用します。ハッシュ値は入力バイト列に依存するため、エンコーディングが異なれば結果も変わります。

注意点

  1. パスワード保存への利用禁止: この単純なハッシュ計算(ソルトなし、ストレッチングなし)をパスワードの保存に使用してはいけません。レインボーテーブル攻撃で容易に突破されるため、パスワード保存には Rfc2898DeriveBytes (PBKDF2) や Argon2 などの専用アルゴリズムを使用してください。
  2. SHA256Managedの非推奨: 古いコードで見かける new SHA256Managed() は .NET の新しいバージョンでは非推奨扱いとなる場合があります。常に静的メソッド SHA256.Create() を使用してください。
  3. 衝突耐性: SHA256は衝突(異なるデータから同じハッシュ値が生まれること)が実質的に発生しないとされていますが、MD5やSHA1は既に安全ではないと見なされています。セキュリティが重要な場面では必ずSHA256以上を選択してください。

応用

ファイルのハッシュ値を計算する

巨大なファイルをメモリに読み込まず、ストリームから直接ハッシュを計算する方法です。

using System.IO;
using System.Security.Cryptography;

string filePath = "example.bin";

using var fileStream = File.OpenRead(filePath);
using var sha256 = SHA256.Create();

// ストリームをそのまま渡せるため、大容量ファイルでもメモリを圧迫しない
byte[] fileHash = sha256.ComputeHash(fileStream);

Console.WriteLine($"File Hash: {BitConverter.ToString(fileHash).Replace("-", "")}");

まとめ

データのハッシュ計算は、SHA256.Create()ComputeHash メソッドを使用するだけで簡単に実装できます。文字列を扱う際はエンコーディング(UTF-8等)の一貫性に注意し、パスワードの保存のような高度なセキュリティ要件には専用のライブラリを使用するなど、目的に応じて適切に使い分けることが重要です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次