ハッシュ化と暗号化の違いとは?
Section titled “ハッシュ化と暗号化の違いとは?”ハッシュ化と暗号化は、どちらも情報セキュリティを支える技術ですが、目的と元データを復元できるかどうかが異なります。
- ハッシュ化(Hashing):データから一定の長さの値(ハッシュ値)を計算する、原則として一方向の処理。主にデータの整合性確認やパスワード照合に利用する。
- 暗号化(Encryption):鍵を使って、権限のない人には読めない形式に変換する処理。正しい鍵などがあれば復号して元のデータを取り出せる。
ハッシュ化と暗号化の違い
Section titled “ハッシュ化と暗号化の違い”| 比較項目 | ハッシュ化 | 暗号化 |
|---|---|---|
| 主な目的 | データの整合性確認、パスワード照合など | データの機密性確保 |
| 元データへの復元 | ハッシュ値から直接復元する仕組みはない | 正しい鍵で復号できる |
| 鍵 | 通常の暗号学的ハッシュ関数には不要 | 必要 |
| 出力 | 一般にアルゴリズムで決まる長さのハッシュ値 | 暗号文(方式や設定によって長さが変わる) |
| 同じ入力への結果 | 同じ関数・入力なら同じ値 | 鍵、nonce/IVなどにより異なり得る |
| 主な用途 | ファイルの照合、電子署名の内部処理、パスワードの検証 | 通信、データベース、ファイル、バックアップの保護 |
| 主な例 | SHA-256、SHA-3、Argon2id(パスワード向け) | AES-GCM、ChaCha20-Poly1305 |
重要:ハッシュ化は「暗号化して鍵を捨てる処理」ではありません。 また、ハッシュ化だけでデータの秘密を守れるわけでもありません。
ハッシュ化とは
Section titled “ハッシュ化とは”ハッシュ関数は、任意の長さのデータからハッシュ値を計算します。例えば、SHA-256は入力サイズにかかわらず256ビット(16進数で64文字)の値を出力します。
元データ ── SHA-256 ──> 256ビットのハッシュ値暗号学的ハッシュ関数に求められる主な性質は次のとおりです。
- 原像計算困難性:ハッシュ値だけを手掛かりに、それに対応する入力を見つけることが非常に難しい。
- 第二原像計算困難性:ある入力と同じハッシュ値になる別の入力を見つけることが非常に難しい。
- 衝突困難性:同じハッシュ値になる異なる2つの入力を見つけることが非常に難しい。
ハッシュ値には有限の長さしかないため、異なるデータが同じハッシュ値になる「衝突」は理論上必ず存在します。「異なるデータなら必ず別のハッシュ値になる」という説明は正確ではありません。
ハッシュ化の利用例
Section titled “ハッシュ化の利用例”| 用途 | 利用方法 | 注意点 |
|---|---|---|
| ファイルの整合性確認 | ダウンロードしたファイルのSHA-256値を公開された値と比較する | 比較するハッシュ値自体が信頼できる経路から得られている必要がある |
| パスワードの保存 | パスワード専用のハッシュ化方式で保存し、ログイン時に検証する | SHA-256の単純適用ではなくArgon2idなどを使用 |
| 電子署名 | 文書のハッシュ値を署名アルゴリズムの入力などに使用する | ハッシュ値を作るだけでは署名にも本人証明にもならない |
| HMAC | 秘密鍵とハッシュ関数を組み合わせ、メッセージの真正性・整合性を検証する | 通常の鍵なしハッシュとは異なる |
| ブロックチェーン | ブロックや取引データの参照・照合などに利用する | ハッシュ単体で台帳全体の安全性が成立するわけではない |
暗号化は、元のデータ(平文)を読めないデータ(暗号文)に変換し、許可された相手が復号できるようにする技術です。
平文 ── 暗号化(鍵) ──> 暗号文平文 <── 復号(鍵) ─── 暗号文共通鍵暗号方式と公開鍵暗号方式
Section titled “共通鍵暗号方式と公開鍵暗号方式”| 項目 | 共通鍵暗号方式(対称暗号) | 公開鍵暗号方式(非対称暗号) |
|---|---|---|
| 鍵 | 暗号化と復号に同じ秘密鍵を使う | 公開鍵と秘密鍵の組を使う |
| 特徴 | 大量のデータを効率よく暗号化できる | 安全な鍵交換・鍵の配送や暗号化などに活用できる |
| 代表例 | AES、ChaCha20 | RSA-OAEPなど |
| 用途 | ファイル、ストレージ、通信データ | 小さなデータや鍵の保護など。実際は共通鍵暗号と組み合わせることが多い |
公開鍵暗号技術は、暗号化だけでなく鍵共有や電子署名にも使われます。ただし電子署名は「秘密鍵で暗号化すること」と単純に同一視できません。目的と使用する方式が異なります。
暗号化の利用例
Section titled “暗号化の利用例”| 用途 | 例 |
|---|---|
| Web通信 | HTTPS(TLS)による通信の保護 |
| データベース | 個人情報や機密項目の暗号化 |
| ストレージ | PCやサーバーのディスク暗号化 |
| バックアップ | 保存先への転送時・保存時の暗号化 |
| クラウド | 暗号化とKMSなどの鍵管理サービスの組み合わせ |
現代のTLS 1.3では、公開鍵暗号技術などによって安全に共有した鍵を利用し、通信データを効率的な共通鍵暗号で保護します。古いSSLの仕組みをそのままTLS 1.3に当てはめないようにしましょう。
代表的なアルゴリズム・規格
Section titled “代表的なアルゴリズム・規格”ハッシュ関数・パスワードハッシュ
Section titled “ハッシュ関数・パスワードハッシュ”| 方式 | 規格・参考文書 | 用途と評価 |
|---|---|---|
| MD5 | RFC 1321 | 128ビット。衝突耐性が破られており、セキュリティ目的での新規採用は避ける |
| SHA-1 | FIPS 180-4 | 160ビット。衝突攻撃が実証されており、新規のセキュリティ用途では避ける |
| SHA-256 / SHA-512 | NIST FIPS 180-4(SHA-2) | 現在広く利用される暗号学的ハッシュ関数 |
| SHA3-256 / SHA3-512 | NIST FIPS 202(SHA-3) | SHA-2とは内部構造が異なるハッシュ関数群。SHA-2が一律に危険という意味ではない |
| Argon2id | RFC 9106 | パスワード保存に適したメモリ負荷の高い方式 |
| scrypt | RFC 7914 | パスワード保存・鍵導出に利用 |
| bcrypt | OpenBSD由来の方式 | 既存システムで広く利用。入力長などの制約に注意 |
| PBKDF2 | NIST SP 800-132など | 規制・互換性上の要件がある環境で利用される鍵導出方式 |
| 方式 | 規格・参考文書 | 用途と評価 |
|---|---|---|
| AES-128 / AES-256 | NIST FIPS 197 | 広く採用される共通鍵ブロック暗号。128/256は鍵長 |
| AES-GCM | NIST SP 800-38D | 機密性と改ざん検出を組み合わせる認証付き暗号(AEAD) |
| ChaCha20-Poly1305 | RFC 8439 | ソフトウェア実装でも利用される認証付き暗号 |
| RSA-OAEP | RFC 8017 | RSAを使う公開鍵暗号化方式 |
| 3DES / TDEA | 旧来の規格 | 現在の新規システムでは採用しない |
AESは暗号アルゴリズム、GCMは動作モードです。「AES-256を使用」と記載するだけで、認証付き暗号として安全に構成されていることまでは示せません。
安全性と実装上の注意点
Section titled “安全性と実装上の注意点”1. パスワードはSHA-256でそのまま保存しない
Section titled “1. パスワードはSHA-256でそのまま保存しない”ハッシュ値から数学的に「復号」はできません。しかし攻撃者は、推測したパスワードを同じ方式でハッシュ化して照合できます。短いパスワードや使い回されたパスワードは、辞書攻撃や総当たり攻撃で見つかる可能性があります。
パスワード保存では、Argon2idを第一候補とし、環境に応じてscrypt、bcrypt、PBKDF2などを検討します。ユーザーごとに一意のランダムなソルトを使い、計算負荷パラメータを適切に設定します。ソルトは通常、ハッシュ値とともに保存して構いません。
登録時:パスワード + 個別ソルト ── Argon2id ──> 保存用ハッシュログイン時:入力パスワード ── 保存済みパラメータで検証 ──> 一致/不一致ソルトは推測済みハッシュ値の使い回しを難しくする仕組みであり、弱いパスワードそのものを強くするものではありません。
2. ハッシュ値の一致だけでは送信元を証明できない
Section titled “2. ハッシュ値の一致だけでは送信元を証明できない”攻撃者がファイルと公開ハッシュ値を両方置き換えられる場合、単純なハッシュ照合だけでは改ざんを検出できません。配布元の真正性も確認したい場合は、信頼できる経路で入手したハッシュ値や電子署名を使用します。
3. 暗号化は「鍵管理」が重要
Section titled “3. 暗号化は「鍵管理」が重要”強いアルゴリズムを採用しても、鍵が漏えいすれば暗号文を読まれる可能性があります。鍵の生成・保管・アクセス制御・ローテーション・廃棄を設計してください。可能であればKMSやHSMなどを利用します。
4. 認証付き暗号を優先する
Section titled “4. 認証付き暗号を優先する”AES-GCMやChaCha20-Poly1305などの認証付き暗号を使用すると、機密性だけでなく暗号文の改ざん検出も行えます。nonce/IVの一意性、認証タグの検証など、方式ごとの利用条件を守る必要があります。特にAES-GCMでは、同じ鍵でnonceを再利用しないでください。
5. 独自の暗号方式を作らない
Section titled “5. 独自の暗号方式を作らない”独自の暗号アルゴリズムや独自のパスワード保存方式を実装するより、実績ある暗号ライブラリやフレームワークの標準APIを利用する方が安全です。
どちらを使うべきか
Section titled “どちらを使うべきか”| 実現したいこと | 推奨する技術 |
|---|---|
| パスワードを保存し、ログイン時に照合したい | Argon2idなどのパスワードハッシュ |
| ファイルが変更されていないか調べたい | SHA-256などのハッシュ関数 |
| ファイルの作成者・配布元も検証したい | 電子署名とハッシュ関数 |
| 他人に内容を読まれずに保存・送信したい | 暗号化(適切な方式と鍵管理) |
| 送信データの改ざんも検出したい | AES-GCMなどの認証付き暗号、または適切なHMAC |
- ハッシュ化は原則として元に戻せない変換で、整合性の確認やパスワードの検証などに利用する。
- 暗号化は鍵を用いて読めないデータに変換し、正しい鍵で復号できるようにする。
- SHA-256とArgon2idはどちらもハッシュ関連技術だが、パスワード保存では高速なSHA-256単独ではなく専用方式を使う。
- 暗号化ではアルゴリズムの選択に加え、鍵管理と認証付き暗号の正しい使用が安全性を左右する。
- NIST FIPS 180-4:Secure Hash Standard (SHA-2)
- NIST FIPS 202:SHA-3 Standard
- NIST FIPS 197:Advanced Encryption Standard (AES)
- NIST SP 800-38D:GCM and GMAC
- OWASP:Password Storage Cheat Sheet
- OWASP:Cryptographic Storage Cheat Sheet
- RFC 9106:Argon2 Memory-Hard Function
- RFC 8439:ChaCha20 and Poly1305
- キヤノンマーケティングジャパン:ハッシュ化と暗号化の違いとは?
- Zenn:暗号化とハッシュ化の違いをまとめてみた
- Qiita:暗号化とハッシュ化の違い