C# Tips | セキュリティ:SHA-512ハッシュを生成する

C# C#
スポンサーリンク
スポンサーリンク

SHA-512ハッシュを生成することは「大容量データの改ざん検知や高強度の識別子生成に役立つ重要なセキュリティ技術」です

読者のみなさんが業務システムや Web API を開発する際、 SHA-512ハッシュを正しく生成・利用することは、データの整合性や安全性を高めるうえで非常に重要です。

SHA-512は SHA-256 よりも長いハッシュ値(512ビット)を生成するため、 より強度の高いハッシュが必要な場面で利用されます。

ここでは、初心者でも理解できるように、 ステップバイステップで考え方を整理しながら、 実務で使える C# の「SHA-512ハッシュ生成ユーティリティ」を丁寧に解説します。

SHA-512ハッシュとは何か

SHA-512の基本的な特徴

SHA-512は SHA-2 ファミリーの一つで、 512ビット(64バイト)のハッシュ値を生成します。

特徴として次のような性質があります。

  • 同じ入力からは必ず同じハッシュ値が得られる
  • 少しでも入力が変わると、ハッシュ値はまったく違うものになる
  • ハッシュ値から元の入力を復元することは現実的に不可能
  • SHA-256よりも長いハッシュ値を生成するため、より強度が高い

SHA-512が使われる実務例

  • 大容量ファイルの改ざん検知
  • データの整合性チェック
  • 高強度の識別子生成
  • 暗号化システムの内部処理
  • ブロックチェーン技術の一部

SHA-512ハッシュ生成の基本ステップ

SHA-512ハッシュを生成する流れは次の3ステップです。

  1. ハッシュしたい文字列またはバイト列を用意する
  2. SHA512 クラスを使ってハッシュを計算する
  3. 計算結果(バイト配列)を Hex または Base64 に変換する

この流れをユーティリティとしてまとめることで、 業務コードの中で何度でも再利用できるようになります。

実務で使える SHA-512ハッシュ生成ユーティリティ(テンプレート)

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

public static class Sha512Utility
{
    /// <summary>
    /// 文字列からSHA-512ハッシュを生成し、Hex形式で返します。
    /// </summary>
    public static string ComputeHex(string input)
    {
        byte[] bytes = Encoding.UTF8.GetBytes(input);

        using var sha512 = SHA512.Create();
        byte[] hash = sha512.ComputeHash(bytes);

        return BitConverter.ToString(hash).Replace("-", "").ToLower();
    }

    /// <summary>
    /// 文字列からSHA-512ハッシュを生成し、Base64形式で返します。
    /// </summary>
    public static string ComputeBase64(string input)
    {
        byte[] bytes = Encoding.UTF8.GetBytes(input);

        using var sha512 = SHA512.Create();
        byte[] hash = sha512.ComputeHash(bytes);

        return Convert.ToBase64String(hash);
    }

    /// <summary>
    /// 任意のバイト配列からSHA-512ハッシュを生成し、Hex形式で返します。
    /// </summary>
    public static string ComputeHex(byte[] data)
    {
        using var sha512 = SHA512.Create();
        byte[] hash = sha512.ComputeHash(data);

        return BitConverter.ToString(hash).Replace("-", "").ToLower();
    }
}
C#

ユーティリティの使い方(例題)

文字列のハッシュを計算する例

string text = "Hello, SHA-512";

string hexHash = Sha512Utility.ComputeHex(text);
Console.WriteLine($"Hex: {hexHash}");

string base64Hash = Sha512Utility.ComputeBase64(text);
Console.WriteLine($"Base64: {base64Hash}");
C#

ファイルのハッシュを計算する例(応用)

using System.IO;

public static class FileHashUtility
{
    public static string ComputeFileSha512Hex(string filePath)
    {
        using var stream = File.OpenRead(filePath);
        using var sha512 = SHA512.Create();

        byte[] hash = sha512.ComputeHash(stream);
        return BitConverter.ToString(hash).Replace("-", "").ToLower();
    }
}
C#

Hex形式とBase64形式の違いを理解する

Hex形式

  • 人間が読みやすい
  • デバッグやログ出力に向いている
  • SHA-512の場合、128文字の16進数になる

Base64形式

  • よりコンパクト
  • JSONや設定ファイルに埋め込みやすい
  • URLに使う場合はBase64Url形式に変換することもある

用途に応じて使い分けることが重要です。

SHA-512の深掘り(重要ポイント)

SHA-512は「高速ハッシュ」である

SHA-512は高速に計算できるため、 パスワード保存やAPIトークン保存には不向きです。

理由: 高速ハッシュは総当たり攻撃に弱いからです。

セキュリティ用途で使う場合の注意

SHA-512をそのまま使うべきではない場面:

  • パスワード保存
  • APIトークン保存
  • 認証情報のハッシュ化

これらは PBKDF2 / bcrypt / Argon2 を使うべきです。

SHA-512ハッシュ生成で絶対にやってはいけないこと

  • パスワードをそのままSHA-512で保存する
  • APIトークンをそのままSHA-512で保存する
  • ハッシュ値を「暗号化」と誤解する
  • ハッシュ値から元の値を復元できると勘違いする

これらは重大なセキュリティ事故につながります。

実務的ベストプラクティス

  • データの整合性チェックや改ざん検知にはSHA-512を使う
  • 認証情報の保存にはPBKDF2 / bcrypt / Argon2を使う
  • ハッシュ値はHexまたはBase64で扱う
  • ハッシュ値をログに出力する際は用途をよく考える
  • ハッシュは「元に戻せない識別子」として扱う

まとめ:SHA-512ハッシュ生成は「高強度のデータ識別と改ざん検知の基盤」

SHA-512ハッシュ生成の本質は次の3つです。

  • 入力から一方向の「強力な指紋」を作る
  • 少しの変更でもまったく違うハッシュになる
  • 大容量データでも高速に処理できる

これらの性質を理解し、 用途に応じて正しく使い分けることで、 業務システムの信頼性とセキュリティを大きく向上させることができます。

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