「このデータはエンコードしてあります」「パスワードはハッシュ化して保存しています」「通信は暗号化されています」——どれも「データを何らかの形に変換した」という意味で使われます。
でもこの3つは、目的も仕組みも、元に戻せるかどうかも、まったく違います。
混同すると「暗号化しているから安全」「エンコードしているから読めないはず」という誤った前提を持ってしまいます。実際のシステム設計やセキュリティの会話でも頻繁に出てくる概念なので、しっかり整理しておきましょう。
まず3つの結論
エンコード:誰でも元に戻せる変換。目的は「形式を揃えること」。 ハッシュ化:元に戻せない一方向の変換。目的は「一致確認と改ざん検出」。 暗号化:鍵を持つ人だけが元に戻せる変換。目的は「第三者に読まれないようにすること」。
エンコードは「翻訳」——誰でも辞書があれば戻せる
エンコードをたとえるなら、外国語への翻訳です。
- 「ありがとう」→「Thank you」
- 辞書(変換ルール)があれば誰でも元に戻せる
- 秘密にする意図はなく、ただ「伝わる形に変える」のが目的
文字コード(UTF-8やShift_JIS)も同じです。 コンピューターは文字をそのまま扱えないため、「あ」を「E3 81 82」のような数値の列に変換する約束事(エンコーディング)があります。 この変換は誰でも逆引きできるので、秘匿性はゼロです。
URLに日本語を含めるときの %E3%81%82 という表記(パーセントエンコーディング)も同じ仕組みで、URLとして扱える文字に変換しているだけです。
エンコードのポイント
- 元に戻せる(可逆変換)
- 誰でも戻せる(鍵は不要)
- 目的は「形式の変換・互換性の確保」
- セキュリティ目的では使わない
ハッシュ化は「ミンチ」——元には絶対戻せない
ハッシュ化をたとえるなら、肉をミンチにする調理です。
- 「塊肉」→「ミンチ」
- 同じ肉を同じ機械に通せば、毎回同じミンチができる
- ミンチから元の塊肉には絶対に戻せない
ハッシュ関数も同じです。 「password123」という文字列を入力すると「ef92b778bafe771207f0…」のような固定長の値(ハッシュ値)が出力されます。 元の文字列には戻せませんが、同じ入力からは必ず同じハッシュ値が出るという性質があります。
この「同じ入力→同じ出力」「逆算不可能」という性質がとても便利です。
パスワードの保存では、パスワードそのものではなくハッシュ値を保存します。 ログイン時に入力されたパスワードをハッシュ化して、保存済みのハッシュ値と比べるだけで「合っているか」がわかります。 データベースが流出しても、ハッシュ値から元のパスワードは取り出せません。
ハッシュ化のポイント
- 元に戻せない(不可逆変換)
- 同じ入力なら必ず同じ出力になる
- 目的は「改ざん検出・一致確認・パスワード保管」
- 暗号化ではないので「解読」という概念がない
暗号化は「鍵のかかった金庫」——鍵を持つ人だけが開けられる
暗号化をたとえるなら、鍵のかかった金庫です。
- 金庫に書類を入れて施錠する(暗号化)
- 鍵を持つ人だけが開けられる(復号)
- 鍵さえあれば元の書類を完全に取り出せる
暗号化の目的は「権限のない第三者に内容を読まれないようにすること」です。 メッセージのやりとりや通信の保護(HTTPS)はこれにあたります。
エンコードと違うのは「鍵を持つ人にしか戻せない」点。 ハッシュ化と違うのは「元のデータに戻せる」点です。
暗号化のポイント
- 鍵があれば元に戻せる(可逆変換)
- 鍵がなければ内容はわからない
- 目的は「第三者への秘匿・通信の保護」
- 鍵の管理が最も重要な課題になる
3つを並べて比べると
| 観点 | エンコード | ハッシュ化 | 暗号化 |
|---|---|---|---|
| 元に戻せるか | 誰でも戻せる | 戻せない | 鍵があれば戻せる |
| たとえ | 外国語への翻訳 | 肉をミンチにする | 鍵のかかった金庫 |
| 主な目的 | 形式の変換・互換性 | 一致確認・改ざん検出 | 内容の秘匿 |
| セキュリティ効果 | なし | 改ざん検出に有効 | 盗聴・読み取り防止 |
| 典型的な用途 | 文字コード・URL変換 | パスワード保管・チェックサム | HTTPS通信・ファイル保護 |
混同が招く誤りの例
「パスワードを暗号化して保存しています」
一見良さそうですが、暗号化では鍵さえ手に入れれば元のパスワードに戻せます。 パスワードは「一致確認できれば十分」なので、元に戻せる必要はありません。 正しくは**ハッシュ化(ソルト付き)**で保存するのが標準です。
「Base64エンコードすれば読まれない」
Base64はエンコードなので、誰でも瞬時にデコードできます。 難読化にはなりますが、セキュリティの意味はほぼありません。 読まれたくないなら暗号化が必要です。
「ハッシュ値を解読された」
ハッシュは元に戻せないので「解読」とは言いません。 似ているのは「総当たり攻撃」や「レインボーテーブル(よくあるパスワードのハッシュ値をまとめた表)を使って一致するものを探す」という方法です。 ソルト(ランダムな値を加えてからハッシュする)で対策できます。
まとめ
- エンコード:翻訳。誰でも戻せる。秘密にする力はない。
- ハッシュ化:ミンチ。元に戻せない。一致確認と改ざん検出に使う。
- 暗号化:金庫。鍵を持つ人だけが戻せる。内容を秘匿するために使う。
「パスワードをどう保存するか」「通信をどう守るか」「ファイルの整合性をどう確認するか」——それぞれ使うべき技術が違います。 「変換している=安全」ではなく、「何のためにどの変換を使っているか」を意識することが、セキュリティを正しく扱う第一歩です。