ハッシュ化とは(一方向関数・暗号化との違い)
ハッシュ化(Hashing)とは、任意の長さのデータを固定長の文字列(ハッシュ値・ダイジェスト)に変換する処理だ。ハッシュ化を行う関数をハッシュ関数、その出力をハッシュ値と呼ぶ。
最も重要な特性は一方向性。ハッシュ値から元のデータを復元することは理論上できない(不可逆)。これがパスワード管理にハッシュ化が使われる理由だ。
ハッシュ値の例
試しに文字列「hello」をSHA-256でハッシュ化すると、次の64文字の16進数になる。
「hello!」に感嘆符1文字を加えただけで、まったく異なるハッシュ値になる(雪崩効果)。たった1文字の差で出力が激変する——これがハッシュ関数のポイントだ。
ハッシュ化と暗号化の違い
「ハッシュ化」と「暗号化」は混同されがちだが、根本的に異なる技術だ。
| 比較項目 | ハッシュ化 | 暗号化 |
|---|---|---|
| 可逆性 | 不可逆(復元不可) | 可逆(復号できる) |
| 鍵の使用 | 不要 | 必要(共通鍵・公開鍵) |
| 出力長 | 固定長 | 入力に依存する可変長 |
| 主な用途 | パスワード保存・整合性確認 | 通信の秘密保護・ファイル暗号化 |
Point
パスワードを「暗号化」して保存するのは誤り。暗号化は復号できるため、鍵が漏れればパスワードが復元される。パスワードは必ずハッシュ化して保存し、ログイン時は入力値を再ハッシュして比較する。
主要なハッシュアルゴリズム比較
主要なハッシュアルゴリズムを用途ごとに整理した。一覧で見ると「どれを使うべきか」の判断が明確になる。
| アルゴリズム | 出力ビット長 | 速度 | 安全性 | 推奨用途 |
|---|---|---|---|---|
| MD5 | 128bit | 非常に高速 | 危険(非推奨) | 使用禁止(レガシー確認のみ) |
| SHA-1 | 160bit | 高速 | 危険(非推奨) | 使用禁止(Git内部のみ) |
| SHA-256 | 256bit | 高速 | 安全 | ファイル整合性・デジタル署名 |
| SHA-512 | 512bit | 高速(64bitCPU) | 非常に安全 | 高セキュリティ要件のデータ保護 |
| bcrypt | 184bit | 意図的に低速 | 非常に安全 | パスワードハッシュ(第一推奨) |
| argon2 | 可変 | 意図的に低速 | 最高レベル | パスワードハッシュ(最新推奨) |
SHA-256はデータ整合性確認に向いているが、パスワード保存には適さない。パスワードには処理が意図的に遅いbcryptやargon2を使うのが現代のベストプラクティスだ。理由は後述する。
MD5が非推奨な理由
MD5(Message Digest Algorithm 5)は1991年設計のアルゴリズムで、かつては広く使われていた。しかし現在ではセキュリティ用途に絶対に使ってはいけないアルゴリズムだ。
衝突攻撃(Collision Attack)
ハッシュ関数の理想は「異なる入力からは必ず異なるハッシュ値が生成される」こと。しかしMD5はこの性質が2004年に破られている。衝突攻撃とは、異なるデータでも同じハッシュ値を生成できる(衝突を起こせる)ことだ。
現代のPCではMD5の衝突を数秒以内に発見できる。「ハッシュ値が一致 = 同じデータ」という前提が完全に崩れており、ファイルの改ざん検証すら信頼できない。
実害が出た事例
2008年、研究者たちがMD5の衝突を利用して不正なSSL証明書を作成し、認証局を騙す攻撃を実証した。これを受けて主要ブラウザはMD5署名の証明書を無効化。MD5の脆弱性は理論上の話ではなく、実際の攻撃に悪用されている。
レインボーテーブル攻撃
MD5のもう一つの致命的な弱点が速度だ。処理が速すぎるためレインボーテーブル攻撃に対して特に無防備になる。レインボーテーブルとは、よく使われるパスワードとそのMD5ハッシュ値を対応させた巨大なデータベースのことだ。
-
テーブルを事前計算
攻撃者は数億〜数十億件のパスワード候補のMD5ハッシュを事前に計算してDB化しておく。現代のGPUなら1秒間に数百億回のMD5計算が可能だ。
-
漏洩したハッシュと照合
DBが漏洩した際、ハッシュ値をレインボーテーブルと照合するだけで元のパスワードを瞬時に逆引きできる。「password」「123456」などのよく使われるパスワードはほぼ100%解読される。
-
アカウント乗っ取り
解読したパスワードで他のサービスに不正ログイン(パスワードリスト攻撃)が行われる。パスワードを使い回していると被害が連鎖する。
SHA-256の特徴と安全性
SHA-256(Secure Hash Algorithm 256-bit)は、NSAが設計しNISTが標準化したアルゴリズムだ。SHA-2ファミリーの一員で、現在のWebインフラに最も広く組み込まれている安全なハッシュ関数といえる。
SHA-256の主な特性
- 出力長が固定: 入力がどれだけ長くても、常に256bit(64文字の16進数)のハッシュ値を出力する
- 雪崩効果: 入力の1ビットを変えるだけで、ハッシュ値のほぼ半分のビットが変化する
- 衝突耐性: 同じハッシュ値を持つ別の入力を見つけることは、現在の計算能力では事実上不可能
- 原像耐性: ハッシュ値から元のデータを復元することはできない
- 高速処理: ファイル整合性確認やデジタル署名に十分な速度がある
SHA-256が使われている場面
| 用途 | 詳細 |
|---|---|
| TLS/HTTPS証明書 | SSL/TLS証明書の署名アルゴリズムとして標準採用 |
| ビットコイン | マイニングのProof of Work、トランザクションIDの生成 |
| ファイルチェックサム | ダウンロードファイルの改ざん検証 |
| Gitコミット | コミット・ブロブ・ツリーの識別子(SHA-1からSHA-256へ移行中) |
| JWT署名 | HMAC-SHA256としてJSONウェブトークンの署名に使用 |
Point
SHA-256は「ファイル整合性確認」や「デジタル署名」には最適だが、パスワード保存には使ってはいけない。高速すぎるためGPU攻撃に対して脆弱だ。パスワードには意図的に低速なbcryptまたはargon2を使うこと。
パスワードのハッシュ化(ソルト・ストレッチング)
パスワードをDBに保存するとき、単純なハッシュ化だけでは不十分だ。2012年のLinkedIn漏洩事件では650万件以上のSHA-1ハッシュが流出し、大半が短期間で解読されている。現代のベストプラクティスは「ソルト + ストレッチング」の組み合わせだ。
ソルト(Salt)とは
ソルトとは、パスワードをハッシュ化する前に付加するランダムな文字列だ。ユーザーごとに異なるソルトを生成して使う。
ソルトを使うとレインボーテーブルを無効化できる。攻撃者は全ユーザーのソルトに対してテーブルを再計算しなければならず、計算量が爆発的に増える。同じパスワードを使っている2人のユーザーもソルトが違えばハッシュ値が異なるため、1人の解読が他に波及しない。
ストレッチング(Key Stretching)とは
ストレッチングとは、ハッシュ計算を何千〜何万回も繰り返して処理時間を意図的に増やす手法だ。
-
正規ユーザーへの影響は小さい
ログイン時に1回だけ実行するため、0.1〜0.5秒程度の遅延が生じるだけ。ユーザー体験への影響はほぼない。
-
攻撃者への影響は甚大
攻撃者は数百億のパスワード候補を試す必要がある。1回の計算が0.1秒かかる場合、100億回の試行に10億秒(約32年)。GPUを駆使してもコストが現実的でなくなる。
bcryptとargon2の選び方
| アルゴリズム | 設計年 | コスト調整 | メモリ使用 | 推奨度 |
|---|---|---|---|---|
| bcrypt | 1999年 | コストファクター(2のべき乗) | 固定(4KB) | 十分安全・実績豊富 |
| argon2id | 2015年 | 時間・メモリ・並列度 | 可変(大量使用可) | 最新推奨(PHC優勝) |
OWASPは新規開発ではargon2idの使用を第一推奨としている。既存システムでbcryptが正しく設定されているなら、わざわざ移行する必要はない。
絶対にやってはいけないこと
MD5またはSHA-1でパスワードをハッシュ化して保存。平文保存。自作の暗号化アルゴリズムを使う。ソルトなしのSHA-256。これらはすべて重大な脆弱性だ。既存システムで心当たりがあるなら、早急にbcryptまたはargon2へ移行してほしい。
ファイルの整合性チェック(チェックサム)
ハッシュ化のもう一つの重要な用途がファイルの改ざん検出だ。ダウンロードしたファイルが途中で破損していないか、あるいは悪意ある第三者に差し替えられていないかを確認できる。
チェックサムの仕組み
-
配布元がハッシュ値を公開
ソフトウェアの配布元は、公式ファイルのSHA-256ハッシュ値をダウンロードページやREADMEに掲載している。LinuxのISOファイルには必ずSHA256SUMSファイルが添付されている。
-
ダウンロード後に自分で計算
ダウンロードしたファイルのSHA-256値を自分のPCで計算する。OSの標準ツールか、当サイトのハッシュ生成ツールで簡単にできる。
-
2つの値を比較
公式サイトの値と自分が計算した値が完全に一致すれば、ファイルは改ざんされておらず正しく転送されたことが確認できる。1文字でも違えば、破損か改ざんの疑いがある。
OSコマンドでのチェックサム確認方法
コマンドラインに慣れていなければ、当サイトのハッシュ生成ツールでドラッグ&ドロップするだけでいい。SHA-256、SHA-512などのハッシュ値がブラウザ上で計算できる。サーバーにデータを送信しないため、機密ファイルを扱う場面でも使いやすい。
ブロックチェーンとハッシュの関係
ビットコインをはじめとするブロックチェーン技術は、ハッシュ化の性質を巧妙に活用している。ブロックチェーンの「なぜ改ざんできないのか」を理解するには、ハッシュの仕組みが核心になる。
ブロックチェーンの基本構造
ブロックチェーンは名前の通り、「ブロック」と呼ばれるデータのかたまりが「チェーン(鎖)」状につながった構造だ。各ブロックに含まれるのは以下の4つ。
- トランザクションデータ: 「AさんからBさんに1BTCを送った」などの取引記録
- 前のブロックのハッシュ値: チェーンをつなぐ重要な要素
- タイムスタンプ: ブロックが作られた時刻
- ナンス(Nonce): マイニングのためのカウンター値
なぜ改ざんが困難なのか
ブロックAのデータを改ざんすると、ブロックAのハッシュ値が変わる。すると、ブロックBが持っている「前のブロック(A)のハッシュ値」と一致しなくなる。これを修正するにはブロックBも変更が必要で、するとブロックCも変更が必要になり……という連鎖が起きる。
さらに、新しいブロックを追加するにはProof of Work(PoW)と呼ばれる膨大な計算(マイニング)が必要になる。ビットコインでは「ハッシュ値の先頭に0が一定数並ぶ」条件を満たすナンスを見つけるために、世界中のマシンが平均10分かけて計算している。
ハッシュが保証する信頼性
ブロックチェーンは「中央の管理者なし」で取引の正当性を証明できる仕組みだ。これを可能にしているのがSHA-256の衝突耐性と一方向性。改ざんには理論上ネットワーク全体の51%以上の計算力が必要で、経済的に引き合わない設計になっている。
ハッシュ生成ツールの使い方
当サイトのハッシュ生成ツールを使えば、テキストやファイルのハッシュ値をブラウザ上で計算できる。すべての処理はブラウザ内で完結し、サーバーにデータは送信しない。機密情報を含むファイルでも安心して使える理由がここにある。
テキストのハッシュ化
-
テキストを入力
ハッシュ化したいテキストを入力欄に貼り付ける。パスワード確認、APIキーの照合、文字列の同一性チェックなどに使える。
-
アルゴリズムを選択
MD5、SHA-1、SHA-256、SHA-512から選択。セキュリティ用途ならSHA-256がおすすめだ。
-
ハッシュ値をコピー
生成されたハッシュ値をワンクリックでコピーできる。リアルタイム計算なので、文字を入力するたびにハッシュ値が更新される。
ファイルのハッシュ確認
ファイルをドラッグ&ドロップするだけで、ファイル全体のSHA-256ハッシュ値を計算できる。ダウンロードしたソフトウェアの公式ハッシュ値と比較するのに便利だ。ファイルサイズを問わず処理できるが、大きなファイルは計算に数秒かかる点だけ注意。