MD5、SHA-256 などのハッシュを生成する方法

· 9 分で読めます

ハッシュ化は任意の入力(パスワード、ファイル、メッセージ)を固定長の文字列に変換します。同じ入力はつねに同じハッシュを生成しますが、入力のわずかな変更でも完全に異なるハッシュを生成します。これにより、ハッシュ化は完全性検証、パスワード保存、デジタル署名、ブロックチェーン証明、その他多数のモダンコンピューティングの構成要素にとって不可欠になります。正しいアルゴリズムを選び、なぜいくつかが破られているかを知り、ハッシュを誤用するパターンを認識することは、5秒のツールを安全に構築できる基盤に変えます。

ハッシュ関数の簡単な歴史

プログラミングのアイデアとしてのハッシュ化は、暗号より数十年も古いです。データ構造のハッシュテーブルは、キーをバケット間に広げるためにCRCやFNVのようなシンプルな関数を使います。不可逆で衝突耐性のあるよう設計された暗号ハッシュは、1980年代後半にRon RivestのMD4(1990年)とMD5(1991年)とともに登場しました。MD5は20年間事実上の標準でしたが、実用的な衝突によりセキュリティ作業に安全でなくなりました。

NISTのSHA-0(1993年)はほぼ即座に取り下げられ、SHA-1(1995年)に置き換えられました。SHA-1はより良く持ちこたえましたが、段階的に陥落しました。2005年の理論的攻撃、2009年までの実用的な証明書偽造シナリオ、2017年のGoogleのSHAtteredによる同じSHA-1ハッシュを持つ2つの異なるPDFの実演です。2001年に発表されたSHA-2ファミリー(SHA-224、SHA-256、SHA-384、SHA-512)は、より長期の置き換えとして設計され、今日でも安全です。SHA-3(Keccak、2015年に標準化)は、SHA-2が陥落した場合のバックアップを提供することを意図した、構造的に異なる設計です。

並行して、パスワード特化のハッシュは別途進化しました。プレーンなMD5やSHA-1はパスワード保存には速すぎることが判明したため、bcrypt(1999年)、scrypt(2009年)、Argon2(2015年、Password Hashing Competitionの勝者)は、ブルートフォース攻撃を桁違いに高価にするために、意図的な遅さとメモリハードネスを追加しました。パスワードに正しいハッシュは、ファイルチェックサムに正しいハッシュと決して同じではありません。

ハッシュ化の仕組み

ハッシュ関数は任意のサイズの入力を取り、固定サイズの出力を生成します:

入力SHA-256ハッシュ(最初の16文字)
hello2cf24dba5fb0a30e...
Hello185f8db32271fe25...
hello!ce06092fb948d9ff...

1文字を変えること(小文字hを大文字Hに)や文字を追加することがハッシュを完全に変えることに注目してください。これはアバランチ効果と呼ばれ、いかに小さくてもどんな変化も発見するのにハッシュを有用にする特性です。

内部的に、モダンなハッシュ関数は入力を固定サイズのブロック(SHA-256で64バイト、SHA-512で128)に分割し、各ブロックを圧縮関数に通し、状態を前方に連鎖させます。出力は最後のブロックが混ぜ込まれた後の最終状態です。連鎖がすべてのバイトに依存するため、攻撃者がハッシュ全体を書き換えずに入力を変えられるショートカットはありません。

良い暗号ハッシュは3つのセキュリティ特性を持ちます: 原像耐性(与えられたハッシュを生成する入力を見つけられない)、第二原像耐性(1つの入力が与えられたとき、同じハッシュを持つ異なる入力を見つけられない)、衝突耐性(同じハッシュを持つ任意の2つの異なる入力を見つけられない)。MD5は3つすべてに失敗します。SHA-1は衝突耐性に失敗します。SHA-2とSHA-3はまだ3つすべてを保持します。

一般的なハッシュアルゴリズム

アルゴリズム出力ビット出力長ステータス用途
MD512832 hex文字破られている(安全でない)レガシーチェックサム、非セキュリティ用途
SHA-116040 hex文字破られている(安全でない)レガシーシステムのみ
SHA-22422456 hex文字安全(ニッチ)SHA-256を好む
SHA-25625664 hex文字安全ファイル完全性、デジタル署名
SHA-38438496 hex文字安全TLS 1.3暗号スイート
SHA-512512128 hex文字安全高セキュリティアプリケーション、64ビット性能
SHA3-25625664 hex文字安全SHA-256への将来対応の代替
BLAKE2b / BLAKE3256または512変動安全、非常に速いrsync、restic、バルクハッシュ化
HMAC-SHA25625664 hex文字安全APIリクエスト署名
bcrypt18460文字(カスタム)パスワードに安全パスワード保存
Argon2id設定可能変動パスワードに最適モダンなパスワード保存
CRC32328 hex文字エラー検出のみセキュリティハッシュではない

SHA-256はほとんどの汎用用途の現在の標準です。MD5とSHA-1は、必要とするレガシーシステムと対話するときだけ使うべきで、セキュリティ境界には決して使わないでください。パスワードには、生のSHA-256ではなくbcryptまたはArgon2idを使ってください。

ハッシュを生成する手順

  1. アルゴリズムを選ぶ: ドロップダウンからMD5、SHA-1、SHA-256、SHA-384、SHA-512を選びます。別を選ぶ特定の理由がない限り、SHA-256を使ってください。
  2. テキストを入力するかファイルをアップロード: 入力ボックスにテキストを入力または貼り付けるか、ファイルをドロップします。ツールはWeb Crypto APIを使ってブラウザ内で完全にハッシュを実行します。
  3. ハッシュをコピー: 結果は検証、保存、比較に使える16進文字列です。多くのツールはコンパクトな保存のためのbase64エンコーディングも提供します。
  4. 必要なら比較: 公開されたハッシュを生成されたハッシュの隣に貼り付け、最初に異なる文字をツールにフラグさせます。64文字の文字列の視覚的比較はエラーが起きやすいです。

実用的な用途

ファイル完全性検証: ファイルをダウンロードしてそのハッシュを発行者の公式ハッシュと比較します。一致すれば、ファイルは本物で破損していません。これがほとんどの日常のハッシュ生成を駆動するユースケースで、Linuxのsha256sum呼び出しとソフトウェアダウンロードのチェックサムページの背後のワークフローです。

パスワード保存: アプリケーションはパスワード自体ではなく、パスワードのハッシュを保存します。ログインすると、入力がハッシュ化されて保存されたハッシュと比較されます。重要な詳細は、ハッシュファイルを盗む攻撃者が合理的な時間内にブルートフォースできないように、アルゴリズムが意図的に遅くなければならない(bcrypt、Argon2)ことです。

データ重複排除: ストレージシステムとバックアップツールはデータのチャンク(しばしば数メガバイトのブロック)をハッシュし、ハッシュをキーとして使います。同じハッシュを持つ2つのチャンクは同一と仮定され、2回目の出現はポインタのみを保存します。restic、borg、多くのクラウドバックアップサービスはこれに依存します。

デジタル署名: デジタル署名は秘密鍵で暗号化されたハッシュです。検証側は文書をハッシュ化し、公開鍵で署名を復号し、2つが一致することをチェックします。これは文書が変更されていないこと、署名者がこの正確なバージョンを承認したことの両方を証明します。

APIセキュリティのためのHMAC: HMACはハッシュ関数を秘密鍵と組み合わせ、同じ鍵を持つ誰もが検証できるタグを生成します。Webhook、AWSリクエスト署名、多くの内部RPCはHMAC-SHA256を使い、受信者がリクエストが本当に信頼できるソースから来たことを知ります。

ブロックチェーンとMerkle木: 暗号通貨、コンテンツアドレスストレージ(IPFS)、Gitはすべて、単一のルートハッシュで大きなデータセットにコミットするためにハッシュ木を使います。木のどこでも1バイトを変えると、ルートハッシュが変わります。これがデータを改ざん明らかにする特性です。

キャッシュキー: キャッシュシステムはリクエストURLやクエリパラメーターをハッシュ化してコンパクトなルックアップキーを生成します。CRCとSipHashは、暗号保証より速度を優先するためにここで一般的です。

ハッシュ対HMAC対デジタル署名

これら3つの概念は、すべて似た見た目の16進文字列を出力するため、しばしば混同されます。

概念入力検証するもの一般的な用途
ハッシュデータハッシュが計算されて以来データが変わっていないチェックサム、コンテンツアドレッシング
HMACデータ + 共有秘密データが変わっておらず、秘密を持つ誰かが作成したAPIリクエスト署名、Webhook
デジタル署名データ + 秘密鍵データが変わっておらず、特定の鍵で署名されたTLS証明書、ソフトウェア署名
暗号化データ + 鍵(任意)転送中にデータが秘密に保たれた機密性(完全性単独ではない)

プレーンなハッシュは誰がそれを作成したかについて何も証明しません。HMACは送信者が共有秘密を持っていたことを証明します。署名は、秘密を共有する必要なく署名者を追加的に識別します。実際の問題を解決する最も弱いツールを選んでください。

よくある落とし穴

代替ツールとライブラリ

ブラウザハッシュジェネレーターは一度限りのハッシュに最速の経路です。繰り返し使用やスクリプトには、コマンドラインと言語ライブラリが引き継ぎます。

ツールプラットフォーム強み注意点
Webハッシュジェネレーターブラウザ瞬時、インストール不要、アップロード不要一度に1つの入力
sha256summd5sumLinuxスクリプト可能、GNU coreutils--checkはSHA256SUMSファイルを読む
shasum -a 256macOS、BSDOSにバンドルLinuxとはバイナリ名が異なる
Get-FileHashWindows PowerShellWindowsでファーストクラス出力形式がsha256sumと異なる
openssl dgst -sha256クロスプラットフォームOpenSSLをすでに持っているなら専用ツールより遅い
b3sum / BLAKE3 CLIクロスプラットフォームマルチGB/sスループット新しい、あまり普及していない
Python hashlibPython組み込み、すべての主要アルゴリズムバイト入力に固執
Node cryptoNode.js組み込み、PythonのAPIに似ている大きなファイルにストリーミング
Web Crypto subtle.digestブラウザJSネイティブ、速い、依存なし非同期APIのみ
HashiCorp Vault / KMSクラウドHMACと署名のための一元的な鍵管理ベンダーロックイン

パスワードには言語エコシステムを異なって扱ってください: bcryptargon2-cffipasslib、またはプラットフォームの推奨アダプターを使い、手作りのSHAループは決して使わないでください。

プライバシーとハッシュジェネレーター

ハッシュジェネレーターは完全にブラウザ内で動作します。入力するテキストはWeb Crypto SubtleCryptoインターフェースでメモリ内にハッシュ化され、選択する任意のファイルはアップロードなしでFileReader APIを通してストリームされます。どの入力がハッシュ化されたかのログも、どのアルゴリズムが人気かの分析も、検証していたものを再構築する方法もありません。ハッシュ自体はしばしば機密素材(パスワード、内部文書、秘密鍵)を要約します。これらはまさに知らないWebフォームに貼り付けるべきでない種類のデータです。クライアントサイドで作業することで、入力はあるべきマシン上に保たれます。チェックサム生成のような日常的なタスクには、プライバシーのデフォルトは、何もページを離れない、何も保存されない、何も共有されない、であるべきです。

よくある質問

MD5、SHA-1、SHA-256 の違いは何ですか?

MD5 は 128 ビット(16 進 32 文字)、SHA-1 は 160 ビット(40 文字)、SHA-256 は 256 ビット(64 文字)のハッシュを生成します。MD5 と SHA-1 は暗号学的に破られているとされています。SHA-256 は現在安全で、整合性検証とセキュリティの両方に推奨されています。

ハッシュを逆変換して元のデータに戻せますか?

いいえ。ハッシュ関数は設計上一方向です。ハッシュから入力を数学的に逆算することはできません。ただし、よくあるパスワードは事前計算されたテーブル(レインボーテーブル)で見つかることがあるため、パスワードはハッシュ化前にソルトを加えることが重要です。

HMAC とは何ですか?

HMAC(Hash-based Message Authentication Code)はハッシュ関数と秘密鍵を組み合わせたものです。データの整合性と真正性の両方を検証, 改ざんされていないこと、および秘密鍵を知る誰かが生成したことを証明します。

データはサーバーに送信されますか?

いいえ。すべてのハッシュ化は Web Crypto API を使ってブラウザ内で実行されます。テキストやファイルがデバイスから出ることはありません。

Why should I never use MD5 or SHA-1 for password storage even with a salt?

Both algorithms are extremely fast, which is the opposite of what you want for passwords. An attacker with a stolen hash file can try billions of guesses per second on a GPU. Password-hashing functions like bcrypt, scrypt, and Argon2 are deliberately slow and memory-hard, which forces attackers to spend orders of magnitude more time per guess.

When should I use SHA-512 instead of SHA-256?

On 64-bit CPUs, SHA-512 is often slightly faster than SHA-256 because its inner state and word size are tuned to 64-bit operations. Use SHA-512 when you want a longer digest (128 hex characters) for collision resistance margin, or when you are already in a SHA-512 ecosystem (TLS 1.3 with certain cipher suites, some HMAC implementations).