MD5、SHA-256 などのハッシュを生成する方法
ハッシュ化は任意の入力(パスワード、ファイル、メッセージ)を固定長の文字列に変換します。同じ入力はつねに同じハッシュを生成しますが、入力のわずかな変更でも完全に異なるハッシュを生成します。これにより、ハッシュ化は完全性検証、パスワード保存、デジタル署名、ブロックチェーン証明、その他多数のモダンコンピューティングの構成要素にとって不可欠になります。正しいアルゴリズムを選び、なぜいくつかが破られているかを知り、ハッシュを誤用するパターンを認識することは、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文字) |
|---|---|
| hello | 2cf24dba5fb0a30e... |
| Hello | 185f8db32271fe25... |
| hello! | ce06092fb948d9ff... |
1文字を変えること(小文字hを大文字Hに)や文字を追加することがハッシュを完全に変えることに注目してください。これはアバランチ効果と呼ばれ、いかに小さくてもどんな変化も発見するのにハッシュを有用にする特性です。
内部的に、モダンなハッシュ関数は入力を固定サイズのブロック(SHA-256で64バイト、SHA-512で128)に分割し、各ブロックを圧縮関数に通し、状態を前方に連鎖させます。出力は最後のブロックが混ぜ込まれた後の最終状態です。連鎖がすべてのバイトに依存するため、攻撃者がハッシュ全体を書き換えずに入力を変えられるショートカットはありません。
良い暗号ハッシュは3つのセキュリティ特性を持ちます: 原像耐性(与えられたハッシュを生成する入力を見つけられない)、第二原像耐性(1つの入力が与えられたとき、同じハッシュを持つ異なる入力を見つけられない)、衝突耐性(同じハッシュを持つ任意の2つの異なる入力を見つけられない)。MD5は3つすべてに失敗します。SHA-1は衝突耐性に失敗します。SHA-2とSHA-3はまだ3つすべてを保持します。
一般的なハッシュアルゴリズム
| アルゴリズム | 出力ビット | 出力長 | ステータス | 用途 |
|---|---|---|---|---|
| MD5 | 128 | 32 hex文字 | 破られている(安全でない) | レガシーチェックサム、非セキュリティ用途 |
| SHA-1 | 160 | 40 hex文字 | 破られている(安全でない) | レガシーシステムのみ |
| SHA-224 | 224 | 56 hex文字 | 安全(ニッチ) | SHA-256を好む |
| SHA-256 | 256 | 64 hex文字 | 安全 | ファイル完全性、デジタル署名 |
| SHA-384 | 384 | 96 hex文字 | 安全 | TLS 1.3暗号スイート |
| SHA-512 | 512 | 128 hex文字 | 安全 | 高セキュリティアプリケーション、64ビット性能 |
| SHA3-256 | 256 | 64 hex文字 | 安全 | SHA-256への将来対応の代替 |
| BLAKE2b / BLAKE3 | 256または512 | 変動 | 安全、非常に速い | rsync、restic、バルクハッシュ化 |
| HMAC-SHA256 | 256 | 64 hex文字 | 安全 | APIリクエスト署名 |
| bcrypt | 184 | 60文字(カスタム) | パスワードに安全 | パスワード保存 |
| Argon2id | 設定可能 | 変動 | パスワードに最適 | モダンなパスワード保存 |
| CRC32 | 32 | 8 hex文字 | エラー検出のみ | セキュリティハッシュではない |
SHA-256はほとんどの汎用用途の現在の標準です。MD5とSHA-1は、必要とするレガシーシステムと対話するときだけ使うべきで、セキュリティ境界には決して使わないでください。パスワードには、生のSHA-256ではなくbcryptまたはArgon2idを使ってください。
ハッシュを生成する手順
- アルゴリズムを選ぶ: ドロップダウンからMD5、SHA-1、SHA-256、SHA-384、SHA-512を選びます。別を選ぶ特定の理由がない限り、SHA-256を使ってください。
- テキストを入力するかファイルをアップロード: 入力ボックスにテキストを入力または貼り付けるか、ファイルをドロップします。ツールはWeb Crypto APIを使ってブラウザ内で完全にハッシュを実行します。
- ハッシュをコピー: 結果は検証、保存、比較に使える16進文字列です。多くのツールはコンパクトな保存のためのbase64エンコーディングも提供します。
- 必要なら比較: 公開されたハッシュを生成されたハッシュの隣に貼り付け、最初に異なる文字をツールにフラグさせます。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は送信者が共有秘密を持っていたことを証明します。署名は、秘密を共有する必要なく署名者を追加的に識別します。実際の問題を解決する最も弱いツールを選んでください。
よくある落とし穴
- セキュリティにMD5やSHA-1を使う: 両方とも暗号的に破られています。衝突は数秒で(MD5)、またはクラウドハードウェアで数時間で(SHA-1)生成できます。それらは厳密に非セキュリティチェックサムに予約してください。
- 汎用ハッシュでパスワードをハッシュ化: パスワードのプレーンなSHA-256は、盗まれたデータベースを持つ攻撃者がGPU上で毎秒数十億の推測を試せるほど速いです。代わりにbcrypt、scrypt、Argon2idを使ってください。
- ソルトを忘れる: 同じパスワードを持つ2人のユーザーは、同じ保存ハッシュを決して生成すべきではありません。ソルティング(ハッシュ化前に各パスワードにランダムバイトを追加)はこれを防ぎ、レインボーテーブルルックアップを止めます。
- ファイルと同じ場所から提供されたハッシュを信頼: ダウンロードミラーを侵害する攻撃者は、ファイルとそのハッシュの両方を交換できます。可能な限り、ハッシュを異なるドメインから取得するか、ハッシュリスト上のGPG署名を検証してください。
- Hexとbase64の混同: 同じハッシュは64 hex文字または44 base64文字にエンコードされます。異なるエンコーディングを比較するとつねに失敗します。比較前にエンコーディングを一致させてください。
- セキュリティコードで
==と比較: 文字列比較は最初の不一致文字でショートサーキットし、タイミング情報を漏らします。認証を決定する任意のコードで定数時間比較関数を使ってください。 - スペース節約のためにハッシュを切り詰める: SHA-256の最初の8文字だけを取ると、衝突耐性を天文学的から自明にカットします。完全なハッシュを保存するか、短い出力用に設計されたハッシュ(SipHash)を使ってください。
- セキュリティにCRCを使う: CRC32は偶発的破損をキャッチするのに優れていますが、偽造するのは自明です。誰もが任意のCRCを任意の選んだ値にするためにバイトを追加できます。
- PBKDFを使う代わりに再ハッシュ化: 手動でSHA-256を10000回ループするのは古典的な自家製パスワードハッシュです。タイミングを漏らし、よく監査されたPBKDF2 / bcrypt / Argon2実装よりずっと遅いです。
- 毎ログインで同じハッシュをソルトの隣に保存: ハッシュとソルトを読む攻撃者は、一度に1つのパスワードをクラックする必要がありますが、すべてのユーザーに単一のグローバルソルトを再利用すると、単一のレインボーテーブルがすべてを破ります。各ユーザーは新鮮なランダムソルトを得ます。
代替ツールとライブラリ
ブラウザハッシュジェネレーターは一度限りのハッシュに最速の経路です。繰り返し使用やスクリプトには、コマンドラインと言語ライブラリが引き継ぎます。
| ツール | プラットフォーム | 強み | 注意点 |
|---|---|---|---|
| Webハッシュジェネレーター | ブラウザ | 瞬時、インストール不要、アップロード不要 | 一度に1つの入力 |
sha256sum、md5sum | Linux | スクリプト可能、GNU coreutils | --checkはSHA256SUMSファイルを読む |
shasum -a 256 | macOS、BSD | OSにバンドル | Linuxとはバイナリ名が異なる |
Get-FileHash | Windows PowerShell | Windowsでファーストクラス | 出力形式がsha256sumと異なる |
openssl dgst -sha256 | クロスプラットフォーム | OpenSSLをすでに持っているなら | 専用ツールより遅い |
b3sum / BLAKE3 CLI | クロスプラットフォーム | マルチGB/sスループット | 新しい、あまり普及していない |
Python hashlib | Python | 組み込み、すべての主要アルゴリズム | バイト入力に固執 |
Node crypto | Node.js | 組み込み、PythonのAPIに似ている | 大きなファイルにストリーミング |
Web Crypto subtle.digest | ブラウザJS | ネイティブ、速い、依存なし | 非同期APIのみ |
| HashiCorp Vault / KMS | クラウド | HMACと署名のための一元的な鍵管理 | ベンダーロックイン |
パスワードには言語エコシステムを異なって扱ってください: bcrypt、argon2-cffi、passlib、またはプラットフォームの推奨アダプターを使い、手作りの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).