2024.02.16
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
はじめに
暗号化とハッシュ化の違い、説明できますか?
本来、暗号化という用語を用いるべき文脈でハッシュ化という用語を使ってしまっていたり、
その逆もまたよく目にします。
暗号化とハッシュ化の違い
暗号化は鍵さえあれば可逆の変換処理ですが、ハッシュ化は不可逆の変換処理です。
つまり、ハッシュ化した値からは元の値を割り出すことはできません。
また、暗号化された値は鍵を使えば元の値がわかります。
※コンピュータの処理速度の向上により、既存の暗号化、ハッシュ化した値は解読されてしまうかもしれません。ここで言っているのは十分に安全な暗号アルゴリズム、ハッシュ化関数を利用した場合のことです。
暗号化の利用例
- ・SSL/TLS通信
- ・VPN通信
- ・SSH通信
- ・DB表領域暗号化(透過的暗号化)
- ・アプリケーション側での暗号化
等あげればキリがないですが、さまざまな場面で暗号化は利用されています。
Webアプリケーション開発時に特に関係してくる、SSL/TLS通信とアプリケーション側での暗号化に関して
下に簡単に記しておきます。
SSL/TLS通信
SSL/TLSは暗号化を通信のどの段階から開始するのか等
バージョンによって違いはありますが、やりとりしたい内容に関しては暗号化された通信です。
インターネットを流れる間、内容は暗号化された状態です。
なので、仮に第三者が通信を盗み見ても、内容を解読するのは困難です。
通信相手は鍵を持っているので、復号して本文が読めます。
アプリケーション側での暗号化
アプリケーション側で暗号化してDBに保存し、
DBからは暗号化されたデータがそのまま戻り、アプリケーション側で復号します。
DBには表領域暗号化機能がありますが、アプリケーション側でも暗号化しておけば、
DBに接続してテーブルを表示するときにショルダーハッキング対策等に有効です。
また、個人情報等重要なカラムをアプリケーション側で暗号化しておけば、
内部ネットワークに侵入され、APサーバとDBサーバ間の通信が復号される状況になってしまった場合等にも有効に働きます。
ハッシュ化の利用例
- ・HMAC
- ・パスワードの保存
等があります。
パスワードの保存
開発者でも知らない方がいい情報は一方向性のあるハッシュ化を使うのがいいです。
たとえば、パスワードは暗号化で保存する場合、悪意のある開発者が復号して不正アクセスされる危険性があります。
なのでハッシュ化して保存すべきです。
暗号アルゴリズム、ハッシュ関数の具体例
代表的な暗号アルゴリズム
AES, Camellia, KCipher-2, RSA, ECDSA, DSA, ECDH, DH
代表的な一方向ハッシュ関数
MD5, SHA-1, SHA-2, SHA-3
よく見る、用語の誤用例
誤用例1
×パスワードをハッシュ関数SHA-2を使って暗号化する。
⚪︎パスワードをハッシュ関数SHA-2を使ってハッシュ化する。
ハッシュ関数を使ってできる操作は暗号化ではなく、ハッシュ化です。
誤用例2
×ハッシュ化された値を復号する。
⚪︎暗号化された値を復号する。(本当は暗号化された値をハッシュ化された値と混同している場合)
ハッシュ化された値から元の値は取得できません。暗号化した値は復号すると元の値がわかります。
誤用例3
×RSAで暗号化された値は復号できない。
⚪︎RSAで暗号化された値は、秘密鍵があれば復号できて、なければ復号できない。
RSAは公開鍵暗号なので、秘密鍵があれば復号できます。
(量子コンピュータの発展次第では総当たりで
解読できてしまう危険性があるようですが、当面は大丈夫なようです。)
おわりに
インターネットにある記事等でハッシュ化と暗号化を混同した誤りが散見されます。
元の値を意味を読み取れない文字列にするという点で共通していて、仕組みがよくわからないので、
両者を混同してしまっているのだと思っています。
一度整理して覚えておくと、こういった誤りも適宜読みかえることができるようになり、
より正確な情報収集、情報伝達ができるようになるので、ぜひ違いを覚えて帰ってください。