ハッシュ・暗号化・エンコードの違い
データを hash すべきか、encrypt すべきか、encode すべきかを理解し、これらの仕組みが互いに置き換え可能でない理由を説明します。
hash、encryption、encoding はすべてデータを変換しますが、解決する問題は異なります。混同すると、弱いパスワード保存、壊れた連携、混乱したデバッグセッションにつながります。
短く言えば、指紋には hash、秘匿には encrypt、トランスポートには encode です。
Hashing は指紋を作る
hash 関数は入力を固定長の digest に変換します。入力の小さな変更は出力を大きく変え、良い暗号学的 hash は一方向性を持つよう設計されています。
hash を使う場面:
- ファイル整合性チェック。
- キャッシュキーとコンテンツ指紋。
- 元データを保存せずに比較する。
- パスワード保存(ただし平文 MD5 や SHA-256 ではなく、password hashing アルゴリズムと salt を組み合わせた場合のみ)。
Hash Generator は、デバッグ中に期待 digest と実際の digest を比較するときに便利です。
Encryption は秘匿を保護する
encryption は鍵があれば復元可能です。元のデータを後で復元する必要があるが、信頼できる当事者だけが復元できる場合に適したツールです。
encryption を使う場面:
- 保存された secret。
- プライベートメッセージ。
- 機密データベースフィールド。
- 安全なチャネル経由で送るデータ。
secret key なしに誰でも値をデコードできるなら、それは encryption ではありません。
Encoding は表現を変える
encoding はデータを特定の構文やトランスポートチャネルに合わせます。通常、secret なしで復元可能です。
encoding を使う場面:
- バイト列の Base64 テキスト表現。
- query parameter 向け URL percent encoding。
- マークアップ内テキスト向け HTML entity escaping。
- JSON 文字列 escaping。
encoding はセキュリティ境界ではありません。Base64 は一瞥では意味が読めなく見えますが、値を保護するものではありません。
適切な仕組みの選び方
解決すべき問題を問いかけます。
- 2 つのファイルが同一か確認したい? → Hash。
- secret を保存して後で復元したい? → Encrypt。
- テキストを URL 内に安全に置きたい? → Encode。
- パスワードを保存したい? → 一般的な encryption や平文 SHA ではなく、password hashing 方式を使う。
混乱を素早くデバッグする
値が読めないときは、文脈を確認します。URL-safe 文字は URL encoding や Base64URL を示唆するかもしれません。固定長の hex 文字列は hash かもしれません。metadata、IV、key ID を含む値は encrypt されているかもしれません。
良いデバッグは、変換を正しく名前付けすることから始まります。その後、適切なツールは通常明らかになります。