0Pricing
Cloud & IT Cert Prep · レッスン

ハッシュとデータ完全性

SHA-256、MD5、HMACが固定長のダイジェストを生成し、転送中または保存中にデータが改ざんされていないことを検証する仕組みを学びます。

「ハッシュとデータ完全性」はCoddyKit上の無料Cloud & IT Cert Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCloud & IT Cert Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。

ハッシュ関数とは

暗号学的ハッシュ関数は、任意のサイズの入力を受け取り、ハッシュ、ダイジェスト、またはフィンガープリントと呼ばれる固定長の出力を生成する数学的アルゴリズムです。ハッシュ関数は一方向性を持つため、ハッシュから元の入力を特定することは計算上困難でなければなりません。また決定論的であり、同じ入力からは常に同じハッシュが生成されます。ハッシュ関数は、データ完全性の検証、デジタル署名、パスワードの保存など、多くのセキュリティ機構の基盤です。

安全なハッシュ関数の性質

安全な暗号学的ハッシュ関数には、4つの重要な性質が必要です。原像計算困難性:ハッシュの出力が与えられたとき、その出力を生成する入力を見つけることが計算上困難です。第二原像計算困難性:ある入力が与えられたとき、同じハッシュを持つ別の入力を見つけることが困難です。衝突耐性:同じハッシュ出力を生成する異なる2つの入力を見つけることが困難です。アバランチ効果:入力を1ビット変更しただけでも、まったく異なるハッシュ出力が生成されるため、改ざんを検出できます。

# Avalanche effect demonstration
echo -n 'Hello' | sha256sum
# 185f8db32...  (completely different when one char changes)
echo -n 'Hello!' | sha256sum
# 334d016f7...  (entirely different hash)

# Same input ALWAYS produces same hash (deterministic)
echo -n 'Security+' | sha256sum
echo -n 'Security+' | sha256sum
# Both outputs are identical

MD5:破られた非推奨アルゴリズム

MD5(Message Digest 5)は128ビットのハッシュを生成し、かつて広く使われていました。しかし2004年、研究者がMD5に対する衝突攻撃を実証しました。これは、同じハッシュを生成する異なる2つの入力を見つけられるということです。完全性検証にとって、これは壊滅的な問題です。攻撃者は、元のファイルと同じMD5ハッシュを持つ悪意のあるファイルに置き換えられる可能性があります。MD5は暗号学的セキュリティの用途では完全に破られており、完全性検証、デジタル署名、パスワードハッシュには使用してはいけません。現在でも、セキュリティを目的としないチェックサム(レガシーなファイル検証)で使われることがありますが、これは偶発的な破損の検出に限って許容されます。

SHAファミリー:SHA-1、SHA-256、SHA-3

Secure Hash Algorithm(SHA)ファミリーは、Security+で扱うハッシュ関数の中でも最も重要なものです。SHA-1(160ビット)は長年標準として使われていましたが、2017年に実用的な衝突攻撃(GoogleのSHAtteredプロジェクト)によって破られ、現在は非推奨です。SHA-256(SHA-2ファミリーの一つで、256ビットの出力)は、デジタル署名、TLS証明書、ファイル完全性検証における現在の業界標準です。SHA-3(Keccak)は、SHA-2の構造を標的とする攻撃への耐性を備えたNISTの代替アルゴリズムですが、ほとんどの用途では依然としてSHA-256が主流です。

# Common hash computations
echo -n 'password123' | sha256sum
# a665a4592...64 hex chars = 256 bits

echo -n 'password123' | sha512sum  
# b109f3bb...128 hex chars = 512 bits (SHA-512)

# File integrity check
sha256sum /path/to/downloaded_file.iso > file.sha256
sha256sum -c file.sha256
# file.iso: OK

パスワード保存におけるハッシュ関数

パスワードを平文で保存することは決して許容されません。ユーザーがパスワードを作成すると、パスワードそのものではなくハッシュがデータベースに保存されます。ユーザーがログインすると、入力されたパスワードをハッシュ化し、保存されているハッシュと比較します。しかし、標準的なSHA-256はパスワード保存には高速すぎます。攻撃者はGPUを使って、盗み出したパスワードデータベースに対して毎秒数十億件のハッシュを試せるためです。bcrypt、PBKDF2、Argon2のような専用のパスワードハッシュ関数は、計算コスト(ワークファクター)とメモリ要件を追加し、大量のクラッキングを現実的でないものにします。

# bcrypt hash example (Python-style pseudocode)
import bcrypt
password = b'mySecretPassword'
# Hash with work factor of 12 (2^12 = 4096 iterations)
hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=12))
# Stored in DB: $2b$12$H0qS/LkPkAiH8KlxJb3lFuK...

# Verify (never compare raw hashes for bcrypt)
bcrypt.checkpw(password, hashed)  # Returns True

ソルト:レインボーテーブルへの対策

レインボーテーブルは、一般的なパスワードとそのハッシュを対応付けた事前計算済みの検索テーブルです。これにより攻撃者は、ハッシュを瞬時に検索して元のパスワードを特定できます。レインボーテーブルへの対策として、パスワードのハッシュにはソルトを付ける必要があります。ソルトとは、ハッシュ化する前にパスワードへ追加するランダムな値です。これにより、2人のユーザーが同じパスワードを使っていても、それぞれ異なるハッシュになります。ソルトはハッシュと一緒に保存します(秘密にする必要はありません)。攻撃者がパスワードデータベース全体を入手しても、ハッシュごとに異なるソルトが使われているため、事前計算済みのレインボーテーブルは役に立ちません。

# Salt demonstration
# Without salt: same password = same hash (rainbow table attack works)
# SHA256('password123') = always the same hash

# With salt: same password + random salt = unique hash
# SHA256('password123' + 'aBc8xZ') = unique hash for this user
# SHA256('password123' + 'mK2pYq') = completely different hash

# The salt is stored in the database alongside the hashed value
# Format: $salt$hash or combined as in bcrypt output

HMAC:ハッシュに認証を追加する

HMAC(Hash-based Message Authentication Code)は、ハッシュ関数と秘密鍵を使って認証コードを生成する方式です。単なるハッシュとは異なり、HMACを計算・検証できるのは秘密鍵を知っている当事者だけです。これにより、完全性(変更の検出)と認証(鍵を持つ者からメッセージが送られたことの証明)の両方を実現できます。HMAC-SHA256は、API認証(APIリクエストへの署名)、JWTトークン、TLSのMAC処理などで広く使われています。これにより、メッセージを傍受した攻撃者が、細工した別のメッセージに置き換えることを防げます。

# Compute HMAC-SHA256 with OpenSSL
openssl dgst -sha256 -hmac 'my-secret-api-key' -hex api_request.json
# Output: HMAC-SHA256(api_request.json)= 3d4e2f...

# Only someone with 'my-secret-api-key' can generate or verify this HMAC
# Used in AWS Signature V4 for API authentication
# Used in JWT HS256 algorithm for token integrity

デジタル署名におけるハッシュ関数

ハッシュ関数は、デジタル署名で中心的な役割を果たします。大きな文書に署名する際、文書全体を秘密鍵で暗号化することはありません(非常に低速になるためです)。代わりに、次の手順を実行します。(1) 文書のハッシュを計算します(高速で、短い固定長のダイジェストを生成します)。次に、(2) その短いハッシュに秘密鍵で署名します。署名は、暗号化されたハッシュそのものです。検証も同じ考え方で行います。署名を復号してハッシュを取得し、文書を独立してハッシュ化して、両者を比較します。現代のPKI証明書ではSHA-256が必須であり、新しい証明書でSHA-1を使うことは禁止されています。

ファイル完全性監視(FIM)

ファイル完全性監視(FIM)は、ハッシュ関数を使って重要なシステムファイルへの不正な変更を検出します。基準状態では、FIMツールが監視対象のすべてのファイルをハッシュ化し、そのハッシュを安全に保存します。定期的または継続的にファイルを再度ハッシュ化し、基準値と比較します。不一致があれば、ファイルが変更されたことを示します。これは、マルウェアや管理者による不正な操作が原因である可能性があります。Tripwire、AIDE(Linux)、Windows独自の完全性チェックなどのFIMツールは、SHA-256ハッシュを使用します。FIMは、カード会員データ環境の保護を定めたPCI-DSSなどのコンプライアンスフレームワークで要求されています。

# AIDE (Advanced Intrusion Detection Environment) - Linux FIM
# Initialize baseline database
aide --init
# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

# Check for changes (run via cron daily)
aide --check
# Output shows any files that were added, changed, or deleted
# File: /etc/passwd changed
# MD5 : old_hash != new_hash

チェックサムと暗号学的ハッシュの違い

チェックサムと暗号学的ハッシュを区別することは重要です。CRC32のようなチェックサムは、送信中に偶発的なデータ破損が起きたことを検出するために設計されています。高速で単純ですが、攻撃者が容易に偽造できます。暗号学的ハッシュ(SHA-256)は、攻撃者による意図的な操作に対しても、衝突への耐性と改ざん検知性を持つように設計されています。ダウンロード中に破損しなかったことだけを確認したい場合はチェックサムを使用し、攻撃者によって意図的に改ざんされていないことを確認したい場合は暗号学的ハッシュを使用してください。

実際のハッシュ衝突攻撃

ハッシュ衝突攻撃は現実の世界にも影響を及ぼします。2017年、研究者は同じSHA-1ハッシュを持つ異なる2つのPDFファイルを作成し、SHA-1証明書を偽造できることを実証しました。2008年には、研究者がMD5の衝突を利用して、正規のものに見える偽のCA証明書を作成しました。こうした攻撃があるため、ブラウザーはMD5やSHA-1の証明書を拒否し、認証局は最低でもSHA-256を使用する必要があります。衝突攻撃を理解すると、アルゴリズムの非推奨化が決定される理由や、「それでもハッシュは生成される」という主張だけでは、破られたアルゴリズムの使用を正当化できない理由を説明できるようになります。

クイックチェック

このレッスンで扱ったCompTIA Security+(SY0-701)の概念について、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、ハッシュ関数が完全性検証のために固定長のダイジェストを生成すること、MD5とSHA-1が破られて非推奨となっていること、SHA-256が現在の標準であること、ソルトがレインボーテーブル攻撃への対策になること、そしてHMACが共有秘密鍵を使ってハッシュに認証を追加することを学びました。次は鍵交換とハイブリッド暗号について学びます。

よくある質問

「ハッシュとデータ完全性」レッスンは無料ですか?

はい。「ハッシュとデータ完全性」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cloud & IT Cert Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。

「ハッシュとデータ完全性」で何を学びますか?

SHA-256、MD5、HMACが固定長のダイジェストを生成し、転送中または保存中にデータが改ざんされていないことを検証する仕組みを学びます。 ブラウザで直接実行するハンズオンコードでCloud & IT Cert Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Cloud & IT Cert Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCloud & IT Cert Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「ハッシュとデータ完全性」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCloud & IT Cert Prepレッスンでコードを書いて実行できますか?

はい。すべてのCloud & IT Cert Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 対称暗号アルゴリズム
  2. 非対称暗号と鍵ペア
  3. ハッシュとデータ完全性
  4. 鍵交換とハイブリッド暗号
← Cloud & IT Cert Prepに戻る