【比較】ハッシュ化・暗号化・エンコードの違い¶
概要¶
「ハッシュ化(hashing)」「暗号化(encryption)」「エンコード(encoding)」は、データを別の表現へ変換する操作という点で見た目が似ているため、初学者が最も混同しやすい3概念です。しかし目的・可逆性・鍵の有無がまったく異なります。ハッシュ化は不可逆な一方向変換、暗号化は鍵で復号できる可逆変換、エンコードは鍵を持たず誰でも元に戻せる単なる表現変換です。
特に危険なのが「Base64 でエンコードしたから安全」「ハッシュ化したから復号して使える」といった誤解で、実際の情報漏えい事故にもつながっています。本記事では NIST(FIPS 197・FIPS 202・CSRC 用語集)と IETF(RFC 4648)の一次資料に沿って、3者を正確に区別します。
詳細比較¶
| 項目 | ハッシュ化 (Hashing) | 暗号化 (Encryption) | エンコード (Encoding) |
|---|---|---|---|
| 目的 | 完全性検証・指紋・パスワード保存 | 機密性の確保(第三者に読ませない) | 表現形式の変換(テキスト安全な転送・保存) |
| 可逆性 | 不可逆(一方向。設計上、元に戻せない) | 鍵があれば可逆(復号できる) | 誰でも可逆(鍵不要) |
| 鍵の有無 | 鍵なし(HMAC は鍵付きだが用途は完全性/認証) | 鍵が必須(対称鍵または公開鍵) | 鍵なし |
| 出力長 | 固定長(任意長入力→固定長出力) | おおむね入力長依存(モードによる) | 入力に対し一定比率で増減(Base64 は約4/3に増加) |
| 代表アルゴリズム | SHA-256、SHA-3(FIPS 202)、bcrypt/Argon2(パスワード用) | AES(FIPS 197、対称鍵)、RSA/ECDH(公開鍵) | Base64/Base32/Base16(RFC 4648)、URL エンコード、UTF-8 |
| セキュリティ提供 | 機密性は提供しない(完全性・改ざん検知向け) | 機密性を提供する | 機密性を一切提供しない(RFC 4648 が明言) |
| 典型用途 | パスワード保存、改ざん検知、データ整合性、署名の前処理 | 通信の保護(TLS)、保存データの暗号化 | バイナリをテキストで運ぶ(メール添付、JWT のセグメント、データ URL) |
NIST の用語集は暗号学的ハッシュ関数を「任意長のビット列を固定長へ写像し、衝突耐性・原像(preimage)耐性=一方向性・第2原像耐性を備える関数」と定義しています。AES は FIPS 197 で「暗号化と復号ができる対称ブロック暗号」と規定され、同じ鍵で元に戻せます。一方 RFC 4648 は Base 系エンコードについて「does not provide any computational confidentiality(計算上の機密性を一切提供しない)」と明記しています。
よくある誤解¶
-
「Base64 でエンコードすれば安全(隠せる)」は誤り。 RFC 4648 は「base encoding visually hides … but does not provide any computational confidentiality」と明言しています。鍵が不要で誰でもデコードできるため、機密保護にはなりません。実際、ログにパスワードを Base64 のまま出して漏えいする事故が知られています。機密性が必要なら暗号化を使います。
-
「ハッシュ化したパスワードは復号して照合する」は誤り。 ハッシュは一方向で復号できません。ログイン時は「入力されたパスワードを同じ方式でハッシュ化し、保存済みハッシュと突き合わせる」だけです。さらに、SHA-256 のような高速ハッシュ単体ではなく、ソルト付きの bcrypt/Argon2 など「パスワード専用のハッシュ」を使うのが正しい運用です。
-
「暗号化とハッシュ化は本質的に同じ(どちらもデータを読めなくする)」は誤り。 暗号化は鍵による可逆変換で「後で元に戻して使う」ためのもの、ハッシュ化は不可逆で「元に戻さず照合・検証する」ためのものです。目的(機密性 vs 完全性)も可逆性も異なります。
-
「JWT は暗号化されているから中身は見られない」は誤り(典型)。 標準的な署名付き JWT(JWS)のペイロードは Base64URL でエンコードされているだけで暗号化されていません。誰でもデコードして中身を読めます。改ざんは署名で検知できますが、機密情報を平文で入れてはいけません(秘匿が必要なら JWE 等の暗号化を使う)。
実務での選び分け¶
- 後で元の値を使う必要があり、第三者に読ませたくない → 暗号化(保存データ/通信は AES、鍵交換は公開鍵)。鍵管理(KMS 等)が要。
- 元の値を復元する必要がなく、一致確認・改ざん検知だけしたい → ハッシュ化。パスワード保存は必ずソルト付きの Argon2/bcrypt/scrypt。
- バイナリをテキスト経路で安全に運びたいだけ(機密性は不要) → エンコード(Base64/URL エンコード)。これは「セキュリティ機能ではない」と理解する。
- 完全性+送信者認証が欲しい → HMAC(鍵付きハッシュ)や電子署名。単なるハッシュやエンコードでは認証にならない。
- 判断の合言葉 → 「戻したい?→暗号化」「戻したくない・照合だけ→ハッシュ化」「ただ形を変えたいだけ→エンコード(守りにはならない)」。
ひとことまとめ¶
ハッシュ化は不可逆な一方向変換(完全性・照合)、暗号化は鍵で復号できる可逆変換(機密性)、エンコードは鍵を持たず誰でも戻せる単なる表現変換(セキュリティ機能ではない)であり、エンコードを秘匿目的に使うのは典型的な誤りです。
出典・参考¶
- NIST CSRC Glossary — Cryptographic hash function — 一方向性(preimage 耐性)・衝突耐性・第2原像耐性の定義
- FIPS 202 — SHA-3 Standard (NIST) — SHA-3 ハッシュ関数の標準仕様
- FIPS 197 — Advanced Encryption Standard (AES) (NIST) — 対称鍵で暗号化・復号できる定義
- RFC 4648 — The Base16, Base32, and Base64 Data Encodings (IETF) — 「does not provide any computational confidentiality」と明記