0Pricing
Cryptology Academy · レッスン

エンコード、暗号化、ハッシュの違い

この3つの概念の違いを明確にし、それぞれをいつ使うべきか理解します。

「エンコード、暗号化、ハッシュの違い」はCoddyKit上の無料Cryptology Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCryptology Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cryptology Academyコースには全4レッスンが含まれています。

3つの異なる処理

エンコーディング、暗号化、ハッシュは、それぞれ異なる目的を持つ、根本的に異なる3つの処理です。これらは混同されがちですが、安全なシステムを設計するには、その違いを理解することが不可欠です。

エンコーディングはセキュリティを提供せずにデータ形式を変換します。暗号化は機密性を保護します。ハッシュは完全性の検証に使う固定長のフィンガープリントを生成します。

エンコーディング:形式の変換

エンコーディングは、互換性やデータ転送のために、データをある形式から別の形式へ変換します。エンコーディングは常に可逆で、鍵を必要としません。エンコーディング方式を知っている人なら誰でも、データをデコードできます。

例として、Base64(バイナリからASCII)、URLエンコーディング(空白を%20で表現)、HTMLエンティティ(&を&で表現)、16進数エンコーディングなどがあります。目的はセキュリティではなく、互換性です。

暗号化:鍵による機密性の保護

暗号化は、鍵を使って平文を暗号文に変換します。正しい鍵を持つ人だけが、その処理を元に戻せます。鍵がなければ、暗号文を復号することは計算量的に困難です。

暗号化アルゴリズムには、AES(共通鍵暗号)、RSA(公開鍵暗号)、ChaCha20などがあります。セキュリティを提供するのは鍵です。アルゴリズム自体は公開情報です。

ハッシュ:一方向の固定長ダイジェスト

暗号学的ハッシュ関数は、任意の長さの入力を受け取り、固定長の出力(ダイジェストまたはハッシュ)を生成します。この関数は決定的です(同じ入力からは常に同じ出力が得られます)が、設計上、元に戻すことはできません。

SHA-256は、入力が1バイトであっても1ギガバイトであっても、常に256ビットの出力を生成します。ハッシュ関数は、完全性チェック、パスワードの保存、デジタル署名に使用されます。

Base64は暗号化ではありません

重要で、よくある誤解があります。Base64でエンコードされたデータは暗号化されていません。Base64をデコードするために必要なのは、それがBase64であると知ることだけです。"=="というパディングや文字セットから、Base64であることが明らかな場合もよくあります。

パスワードを"cGFzc3dvcmQ="("password"をBase64にしたもの)としてエンコードしても、攻撃者は数秒でデコードできます。セキュリティの文脈におけるBase64は、データを隠すためではなく、転送時の互換性を確保するためだけに使用します。

パスワードのMD5はハッシュであり暗号化ではありません

パスワードをMD5でハッシュすると、パスワードは一方向のダイジェストとして保存されます。MD5ハッシュを「復号」してパスワードを取り出すことはできません。しかし、MD5は処理が速すぎるため、パスワードハッシュ関数として適していません。

攻撃者はGPUを使って毎秒数十億個のMD5ハッシュを計算できるため、総当たり攻撃やレインボーテーブル攻撃が現実的になります。パスワードの保存には、bcrypt、scrypt、Argon2のような低速でメモリハードな関数が必要です。

AES-GCMは認証付き暗号です

AES-GCM(Galois/Counter Mode)は、機密性(暗号化)と完全性(認証)の両方を提供します。暗号化にはAESをカウンターモードで使用し、認証にはGHASHを使用します。

AES-GCMが生成する認証タグによって、暗号文が改ざんされると検出できます。このため、AES-GCMはAssociated Data付き認証付き暗号(AEAD)方式であり、現代の暗号化における標準的な方式です。

SHA-256はハッシュ関数です

SHA-256(Secure Hash Algorithm 256-bit)は、NISTによって標準化された暗号学的ハッシュ関数です。256ビットのダイジェストを生成し、衝突攻撃や原像攻撃を含む、既知のすべての攻撃に対して安全だと考えられています。

SHA-256は、TLS証明書、Bitcoinのマイニング(プルーフ・オブ・ワーク)、HMACメッセージ認証、RSA-SHA256やECDSAなどのデジタル署名方式で使用されています。

開発者がよく犯す間違い

これら3つの処理の混同から生じる、よくあるセキュリティ上の間違いには、パスワードをハッシュ化せず暗号化して保存すること(暗号化鍵が本当の脆弱性になります)、機密データに暗号化ではなくエンコーディングを使うこと、MD5やSHA-1のような高速なハッシュをパスワードの保存に使うこと、そしてBase64であれば安全だと考えることがあります。

もう1つの間違いは、同じ関数を複数の目的に使うことです。たとえば、HMAC構造を使わずにハッシュ関数をMACとして使うと、長さ拡張攻撃に対して脆弱になります。

それぞれを使う場面

バイナリデータをテキストプロトコルで転送する場合、バイト列をテキストフィールドに保存する場合、またはデータをURLに埋め込む場合は、エンコーディングを使用します。パスワードの保存(bcryptまたはArgon2を使用)、データの完全性の検証(チェックサム)、可変長データからの固定長識別子の生成には、ハッシュを使用します。

正しい鍵があれば復元できる機密データを保存または転送する必要がある場合は、暗号化を使用します。転送中の完全性と機密性の両方を確保するには、ハッシュと暗号化(AEAD)を組み合わせます。

実際に3つすべてを組み合わせる

適切に設計された認証システムでは、3つすべてを使用します。パスワードはArgon2でハッシュ化し(ハッシュ)、そのハッシュをAES-256によるカラム暗号化でデータベースのフィールドに保存し(暗号化)、ログイン後に返すAPIトークンはBase64urlでエンコードします(エンコーディング)。

それぞれの処理には固有の目的があります。用途に応じて適切な処理を見分けることは、応用暗号学と安全なシステム設計における基本的なスキルです。

エンコーディングと暗号化のクイズ

エンコーディング、暗号化、ハッシュについての理解度を確認しましょう。

要点:エンコーディングと暗号化とハッシュの違い

エンコーディング(Base64、16進数)は、セキュリティを伴わない形式変換です。暗号化(AES-GCM)は、鍵を必要とする可逆的な機密性を提供します。ハッシュ(SHA-256、Argon2)は、不可逆な固定長ダイジェストを生成します。

セキュリティのためにエンコーディングを使ってはいけません。パスワードには低速なハッシュ(Argon2またはbcrypt)を使用します。転送中または保存中の機密データには、認証付き暗号(AEAD)を使用します。これらの分類を混同することは、セキュリティ脆弱性の最も一般的な原因の1つです。

よくある質問

「エンコード、暗号化、ハッシュの違い」レッスンは無料ですか?

はい。「エンコード、暗号化、ハッシュの違い」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cryptology Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cryptology Academyコースには全4レッスンが含まれています。

「エンコード、暗号化、ハッシュの違い」で何を学びますか?

この3つの概念の違いを明確にし、それぞれをいつ使うべきか理解します。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Cryptology Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCryptology Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「エンコード、暗号化、ハッシュの違い」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCryptology Academyレッスンでコードを書いて実行できますか?

はい。すべてのCryptology Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Base64エンコードの仕組み
  2. ASCII、Unicode、テキスト表現
  3. 暗号出力における16進数
  4. エンコード、暗号化、ハッシュの違い
← Cryptology Academyに戻る