こんにちは🔍
エンコード、エンクリプト、ハッシュって全部データを何かに変換することを表す言葉だと思うのですが、違いがいまいち分かっていない…汗
今回は、似たような言葉の意味を比較してちゃんと覚えようと思います💡
特に参考にさせていただいた記事
認証基盤サービスで有名なAuth0のブログにこんな記事がありましたので、今回はこちらを特に参考にさせていただきました。
エンコード/encoding
エンコードとは、データをある形式から他の形式に変換し、他のシステムで使えるようにすることです。
例えば、電子メールを送るときは、メールの内容を一旦ASCIIコードと呼ばれる文字コードに変換してから送信し、受信側で元に戻して(デコードして)読めるようにする、といった処理が行われています。
このように、エンコードは可逆的な処理のため、元に戻すことができます。そして、同じ情報を異なる形式で表すことで、異なるデータ形式を扱うシステム間でもデータをやりとりできるようにしているのです。
ここで注意したいのは、エンコードの目的はセキュリティ向上ではないということです。むしろ、他のシステムがデコードできるように方式を公開しておく必要があります。
エンクリプション/encryption
エンクリプションは、権限を持たない人には分からない・デコードしにくいようにデータを変換することです。日本語だと暗号化に当たります。
先程のエンコードと似ているように思えますが、目的に違いがあります。エンコードは「(他のシステムが)分かるように変換する」のですが、エンクリプションは「(権限のない人には)分からないように変換する」という点です。
権限のある人はキーを持っているのでdecrypt(復号)できます。暗号化は、鍵(文字や数字の羅列)に基づいた数学的アルゴリズムを使うことが良いとされています。
- 対称鍵暗号方式…encryptとdecryptに同じキーを使用する
例)AESアルゴリズム - 非対称鍵暗号方式…encryptとdecryptに異なるキーを使用する
例)RSA
ハッシング/hashing
ハッシングは、インプットデータに厳密に基づき、一意な固定長の文字列を生成することです。パスワードや電子メール、本や映像の内容など膨大なサイズのデータでも、重複しない・決まった長さのハッシュ値を算出することができるのです。
ハッシュ化すると、同じインプットからは同じアウトプットが算出されます。逆に言えば、インプットが違えばアウトプットも違ってきます。この特徴を生かして、2つのハッシュ値を比較することで、内容に違いがないか厳密に確認することができます。
ハッシングの特徴に、ハッシュ値から元の入力値を取得するのは不可能(極めて困難)であることが挙げられます。また、ハッシュ値には衝突(異なる入力値から同じハッシュ値が算出されてしまうこと)の可能性があることが、MD5やSHAの初期のアルゴリズムで発見されています。
💡Pythonでハッシュ値を求める例は こちら の記事の中で触れています。
まとめ
encoding | encrypting | hashing | |
---|---|---|---|
何か | データの形式を変換すること | データを暗号化すること | データを固定長の文字列に変換すること |
目的 | 他のシステムで使えるようにする | 権限を持たない人には分からないようにする | ハッシュ値を比較して、ファイルの同一性を確認する |
可逆性 | 可逆 | 可逆 | 不可逆 |
例 | ASCII, unicode, Base64 | AES, RSA | MD5, SHA |
おわりに
それぞれの違いをまとめることができスッキリしました!!
こんがらがってしまわないように、意識して使い分けしたいと思います。