暗号化とハッシュ化の違いをまとめてみた
はじめに
Webサービスを作るうえで、セキュリティ対策は避けて通れません。
中でもよく出てくるのが「暗号化」と「ハッシュ化」。
名前は聞いたことあるけど、どう違うのかよくわからないという人も多いんじゃないでしょうか。
この記事では、暗号化とハッシュ化の違いを具体例・図解的なイメージ・実際の使用シーンを交えながら、できるだけわかりやすく解説していきます。
暗号化とは?
🔐「読めないようにして、あとで元に戻せる技術」のことを指します。
では、実際どのような時に使われるのかみていきましょう。
- 氏名、電話番号、住所などの個人情報
- Web通信の暗号化(SSL/TLS)
などが挙げられます。
特長
項目 | 内容 |
---|---|
可逆性 | ✅ あり(元に戻せる) |
目的 | 🔒 第三者に見られないようにする |
復元方法 | 🗝️ 秘密鍵や公開鍵で「複合(decrypt)」する |
例 | 🌐 SSL/TLS, AES, RSA |
暗号化は、可逆操作が可能なため復元ができます。
例えると、レゴで作ったロボットを一度バラバラにして、また元の形に戻せる。
このバラすが暗号化で、元に戻すが複合
以下のイメージだと、「手紙を鍵付きの箱に入れて送る」といった感じです。
中身を見られないように、開けるには鍵が必要。それが暗号化です。
ハッシュ化とは?
🔏暗号化とは違い、「元に戻せないようにする技術」のことを指します。
こちらも実例をみていきましょう。
- サービス登録時のパスワード管理
- データが改ざんされていないかのチェック
などがあります。
特長
項目 | 内容 |
---|---|
可逆性 | ❌ なし(元に戻せない) |
目的 | ✅ 一方向的なチェック(照合・改ざん防止) |
例 | 🧠 SHA-256, bcrypt, PBKDF2 |
イメージ
スタンプ(印鑑)で押すイメージ
紙にスタンプを押すと、その印影(模様)はできるけど、「スタンプを見ただけで元の形には戻せない」ですよね。
押したスタンプ:ハッシュ値
元のスタンプの彫り:パスワードやデータ
つまり、一方通行。
「押す」ことはできるけど、「元のスタンプを復元」はできない。ということです。
ハッシュ化の弱点
ハッシュ化の性質として、同じデータからは必ず同じハッシュ値が出てきます。
パスワード:password123 → ハッシュ値:abc123xyz
この性質を逆手にとって、
ハッカーは「レインボーテーブル」という“答え合わせ辞書”を使って
「このハッシュ値はこの元の文字列だな」と推測してくることがあります。
つまり、パスワードのハッシュだけでは突破される可能性があるということです。
どう守るのか
ここで登場するのが、「ソルト」「ペッパー」「ストレッチング」 という3つの防御技術です。
用語 | なにをする? | ざっくり例えると… |
---|---|---|
ソルト(Salt) | 入力データにランダムな文字列を加える | 同じ料理にスパイスを毎回変えて違う味にする |
ペッパー(Pepper) | 固定の“隠し味”を加える。DBには保存しない | 秘伝のタレ(レシピは秘密!) |
ストレッチング(Stretching) | ハッシュ処理を何百〜何千回繰り返す | ロックを何重にもかけて、開けにくくする |
結果として、
- ソルトがあると、同じパスワードでもハッシュ値が毎回変わるので、レインボーテーブルでは解けない
- ペッパーがあると、たとえDBが盗まれてもハッシュ化に必要な“鍵”が手元にない
- ストレッチングでハッシュ化を重くすることで、総当たり攻撃に時間がかかる
💡補足
bcrypt
など、これらの対策を最初から組み込んだライブラリもあります。
歴史ネタ:シーザー暗号
紀元前にカエサルという人物が使っていたシンプルな手法
アルファベットを数文字ずらすだけ(例:A → D)
まとめ
暗号化とハッシュ化、使い分けのポイント
🗺️ シーン | 🛠️ 適した技術 | 🤔 なぜ? |
---|---|---|
📩 フォーム送信やログイン通信 | 🔐 暗号化 | 通信中に盗み見されないようにするため |
🔑 パスワードを保存するとき | 🔏 ハッシュ化 | 万が一流出しても元の文字がバレないように |
📁 ファイルの改ざんチェック | 🔏 ハッシュ化 | 内容が変わったかどうか瞬時に確認できる |
💳 クレジットカード情報の保護 | 🔐 暗号化 | 復元可能な形で安全に保管・通信する必要があるため |
暗号化とハッシュ化は、どちらも「データを守るための技術」 ですが、目的も、使い方もまったく違いましたね。
この記事が、セキュリティについてちょっと気になるきっかけになってくれたらうれしいです。
Discussion