ハッシュとは何か、なぜテクノロジーのあらゆる場所にあるのか
こんな文字列を見たことがあるでしょう:
e3b0c44298fc1c149afbf4c8996fb924
27ae41e4649b934ca495991b7852b855
ソフトウェアのダウンロード(「SHA-256ハッシュを確認してください」)、ブロックチェーンの話題、パスワードセキュリティの議論、そして数え切れないほどの開発者ツールに登場します。しかし、ハッシュとは実際に何で、なぜ現代のテクノロジーにとってこれほど基本的なのでしょうか?
わかりやすく説明するコンセプト
ハッシュ関数は任意の入力(単語、文章、ファイル全体)を受け取り、ハッシュ値(ダイジェスト、チェックサム、フィンガープリントとも呼ばれる)と呼ばれる固定長の出力を生成します。主な特性は:
- 決定的。 同じ入力は常に同じ出力を生成します。
- 固定長。 入力がどれほど大きくても、出力は常に同じサイズです。
- 一方向。 ハッシュ出力から元の入力を復元することはできません。
- アバランシェ効果。 入力のわずかな変更が、まったく異なるハッシュを生成します。
データの指紋のようなものです。あなたの指紋があなたを一意に識別しますが、顔を復元するのには使えないのと同様に、ハッシュはデータの一部を一意に識別しますが、元のデータを復元するのには使えません。
シンプルな例
SHA-256ハッシュ関数が非常に似た2つの入力に対して何をするかを見てみましょう:
| 入力 | SHA-256ハッシュ(先頭16文字) |
|---|---|
| "Hello" | 185f8db32271fe25... |
| "hello" | 2cf24dba5fb0a30e... |
| "hello!" | ce06092fb948d9ff... |
1文字変更する(大文字のHを小文字のhに)か、感嘆符を追加するだけで、まったく異なるハッシュが生成されます。パターンも予測可能な関係もありません。これがアバランシェ効果の実例です。
ご存知ですか? 空の入力(文字通り何もない)のSHA-256ハッシュはe3b0c44298fc1c14...です。これはよく知られた定数です。世界中のすべてのSHA-256実装が、空の入力に対してまったく同じ出力を生成します。
一般的なハッシュアルゴリズム
MD5
- 出力: 128ビット(16進数32文字)
- 状態: セキュリティ目的では破られています。衝突(異なる入力が同じハッシュを生成する)が数秒で生成可能。
- まだ使われている用途: セキュリティが問題にならないファイル整合性チェック(例:ダウンロードが破損していないことの確認)。
SHA-1
- 出力: 160ビット(16進数40文字)
- 状態: セキュリティ目的では非推奨。衝突が実証されています。
- まだ使われている用途: レガシーシステム、Gitコミット識別子。
SHA-256
- 出力: 256ビット(16進数64文字)
- 状態: 現在の標準。既知の実用的な攻撃はありません。
- 用途: パスワード保存、デジタル署名、ブロックチェーン、ファイル検証、TLS証明書。
SHA-512
- 出力: 512ビット(16進数128文字)
- 状態: 現在の標準。SHA-256よりもさらに大きなセキュリティマージン。
- 用途: 高セキュリティアプリケーション、一部のパスワードハッシュスキーム。
注意 MD5とSHA-1はセキュリティ目的(パスワード、デジタル署名、証明書)には決して使用すべきではありません。暗号学的に破られています。セキュリティ関連にはSHA-256またはSHA-512を使用してください。
ハッシュが使われている場所
パスワードの保存
アカウントを作成すると、Webサイトは実際のパスワードを保存しません(すべきではありません)。代わりに、パスワードのハッシュを保存します。ログインすると、システムは入力されたパスワードをハッシュ化し、保存されたハッシュと比較します。一致すれば認証成功です。
これは、データベースが侵害されても、攻撃者が得るのはハッシュであってパスワードではないことを意味します。ハッシュからパスワードを逆算することはできません(ただし、一般的なパスワードをハッシュ化して比較することで推測を試みることはできます)。
最新のパスワードハッシュは、bcrypt、scrypt、Argon2などのアルゴリズムでさらに進んでおり、ソルト(ランダムデータ)を追加し、意図的に遅くすることで、総当たり推測を非現実的にしています。
ファイル検証
ソフトウェアをダウンロードすると、WebサイトがファイルのSHA-256ハッシュを提供することがよくあります。ダウンロード後、自分でファイルをハッシュ化して比較します。ハッシュが一致すれば、ファイルは発行者が意図した通りのものです。異なれば、ダウンロード中にファイルが破損または改ざんされています。
期待値: a1b2c3d4e5f6...
あなたのファイル: a1b2c3d4e5f6... ✓ 一致 — ファイルは正規品
ブロックチェーンと暗号通貨
ブロックチェーンの各ブロックには前のブロックのハッシュが含まれ、切れない連鎖を作ります。誰かが過去の取引を改ざんしようとすると、そのブロックのハッシュが変わり、その時点から連鎖が壊れるため、改ざんは即座に検出可能になります。
Bitcoinのマイニングは、本質的に特定の数のゼロで始まるSHA-256ハッシュを生成する入力を見つける競争です。
デジタル署名
ドキュメントにデジタル署名する際、実際にはドキュメント全体を秘密鍵で暗号化するわけではありません。代わりに、ドキュメントをハッシュ化し、そのハッシュを暗号化します。これははるかに高速で、コンパクトな署名を生成します。
データの重複排除
クラウドストレージサービスは、重複ファイルを検出するためにハッシュを使用します。2人のユーザーが同じファイルをアップロードすると、同じハッシュを持つため、サービスは1つのコピーのみを保存すればよいのです。
Gitバージョン管理
Gitのすべてのコミット、ファイル、ツリーはSHA-1ハッシュで識別されます。これがGitがファイルの変更を検知し、プロジェクトの全履歴を追跡する方法です。
ご存知ですか? GitはSHA-1からSHA-256への移行を徐々に進めています。この移行は、2017年にSHA-1の衝突が実証され、理論的に同じ識別子を持つ2つの異なるコミットを作成できる可能性が示されたために始まりました。
不可逆性の問題(そしてなぜ重要か)
ハッシュの一方向性は、最大の強みであると同時に、頻繁な混乱の原因でもあります。
ハッシュを「復号化」することはできません。 ハッシュは暗号化ではありません。暗号化は双方向です:鍵で暗号化し、鍵で復号化します。ハッシュは一方向です:入力からハッシュを計算できますが、ハッシュから入力を計算することはできません。
ハッシュを「逆算」する唯一の方法は、元の入力を推測し、推測をハッシュ化し、一致するかどうかを確認することです。短くシンプルな入力(一般的なパスワードなど)では実行可能です。長くランダムな入力では、計算上不可能です。
これがパスワードの長さが非常に重要な理由です。「password123」のハッシュは一般的なパスワードを試すことで見つかります。「j8#kL9$mN2@pQ5&」のハッシュは、推測で見つけるには宇宙の年齢よりも長い時間がかかるでしょう。
自分で試してみる
ハッシュを理解する最良の方法は実験することです。単語をハッシュ化し、1文字変えて出力がどれほど完全に変わるか見てみましょう。変更前後のファイルをハッシュ化して違いを確認しましょう。
ヒント 任意のテキストやファイルのハッシュを生成・検証:ハッシュの生成と検証方法。SHA-256、MD5、SHA-512などを試せます — 即座に、無料で、ブラウザで。
ハッシュをハンズオンで探索:
無料、即座に、登録不要です。