← 用語集一覧へ戻る

暗号化

Encryption
security network beginner
データを特定のルールに従って変換し、鍵を持つ者だけが読み取れるようにする技術。
暗号化 (Encryption)

概要(サマリー)

暗号化(Encryption)とは、データを一定のルール(アルゴリズム)に従って変換し、対応する「鍵」を持つ人だけが元のデータに戻せるようにする技術である。

たとえば「鍵付きの日記帳」を思い浮かべてほしい。日記そのもの(データ)は誰でも手に取れるが、鍵がなければ読めない。インターネット上の通信では、この暗号化が盗聴・改ざんから情報を守るために欠かせない仕組みになっている。HTTPS通信も、SSL/TLSによる暗号化によって安全が保たれている。

詳細解説

暗号化とは何か

暗号化の流れをシンプルに示すと次のようになる。

  1. 元のデータ(平文)を鍵と暗号化アルゴリズムで変換する
  2. 変換後の読めないデータ(暗号文)が生成される
  3. 対応する鍵で復号すると元のデータに戻る

この「鍵」の仕組みによって、鍵を持たない第三者は暗号文を見ても内容を理解できない。

共通鍵暗号と公開鍵暗号

暗号化には大きく2種類ある。

共通鍵暗号(対称鍵暗号)
- 暗号化と復号に同じ鍵を使う
- 処理速度が速い
- 鍵の共有・管理が難しい(送受信者が同じ鍵を事前に持つ必要がある)
- 代表例:AES

公開鍵暗号(非対称鍵暗号)
- 暗号化に使う「公開鍵」と、復号に使う「秘密鍵」の2つを使う
- 公開鍵は誰でも使えるが、復号は秘密鍵を持つ本人だけができる
- 鍵交換が安全にできるが、処理は遅め
- 代表例:RSA・楕円曲線暗号
- 公開鍵認証SSH)もこの仕組みを利用している

実際のSSL/TLS通信では、公開鍵暗号で共通鍵を安全に交換し、その後は高速な共通鍵暗号を使うハイブリッド方式が採用されている。

ハッシュとの違い

ハッシュと混同されやすいが、暗号化はまったく別の技術だ。

暗号化 ハッシュ
目的 安全な伝送・保存 改ざん検知・パスワード保存
元に戻せるか 鍵があれば戻せる(可逆) 元に戻せない(不可逆)
使用例 HTTPS通信・ファイル暗号化 パスワード保存・ファイル検証

実装でよく使う暗号化

現代のWeb開発では、直接暗号化アルゴリズムを実装することはほとんどなく、ライブラリやプロトコルを使う。

// Node.jsのcryptoモジュールを使ったAES-GCM暗号化の概念例
const crypto = require('crypto');
const algorithm = 'aes-256-gcm';
const secretKey = crypto.randomBytes(32);

function encrypt(text) {
  const iv = crypto.randomBytes(12);
  const cipher = crypto.createCipheriv(algorithm, secretKey, iv);
  const encrypted = Buffer.concat([cipher.update(text), cipher.final()]);
  const authTag = cipher.getAuthTag();

  return {
    iv: iv.toString('hex'),
    authTag: authTag.toString('hex'),
    encrypted: encrypted.toString('hex')
  };
}

これは仕組みを理解するための短い例であり、本番では鍵の保存場所、鍵のローテーション、復号時のエラー処理まで設計する必要がある。実際の開発では、通信はHTTPS(SSL/TLS)に任せ、パスワード保存は暗号化ではなくハッシュ(bcrypt等)を使うのが基本だ。

暗号化が求められる場面

  • HTTPS通信(SSL/TLS)
  • 個人情報や設定ファイルの暗号化保存
  • パスワードの安全な保存(暗号化ではなくハッシュ化が基本)
  • ファイルの暗号化保存
  • メールの暗号化
  • APIキーの安全な管理

AIコーディングとの関係

AIに暗号化の実装を依頼するときは、「何を暗号化したいか」「どの言語・環境か」「何のための暗号化か」を明確に伝えることが重要だ。たとえば「Node.jsでユーザーのパスワードを安全に保存するためのハッシュ化の方法をbcryptで教えて」「PythonでAES暗号化を実装する例を教えて」といった形で依頼しよう。AIが生成した暗号化コードは、鍵の管理方法が不十分なことがあるため、本番実装前にセキュリティの観点からレビューすることを強く推奨する。

よくある勘違い

暗号化 = ハッシュ?

暗号化は鍵があれば元に戻せる(可逆)が、ハッシュは元に戻せない(不可逆)。パスワードは「確認用」であれば戻す必要がないのでハッシュが適切であり、暗号化は「後で復号して使いたいデータ」に使う。用途によって使い分けが必要だ。

HTTPSなら完全に安全?

HTTPSは通信経路の暗号化であり、サーバー側のセキュリティやアプリの脆弱性を保証するものではない。フィッシングサイトでもHTTPSを使える時代になっており、「HTTPS = 安全なサイト」という思い込みは危険である。

暗号化すれば個人情報を好き勝手に使ってよい?

暗号化はデータ保護の技術的手段のひとつであり、法律(個人情報保護法等)上の義務や適切な使用を免除するものではない。暗号化は「万が一漏れても読まれにくくする」対策であって、収集・利用の許可を与えるものではない。

まとめ

  • 暗号化はデータを変換して鍵を持つ者だけが読めるようにする技術
  • 共通鍵暗号(AES等)と公開鍵暗号(RSA等)の2種類があり、HTTPS通信ではハイブリッド方式が使われる
  • ハッシュとは目的・可逆性が異なるため混同しないこと
  • Web開発では通信はHTTPS、パスワードはハッシュ(bcrypt等)を使い分けるのが基本
  • 暗号化コードの鍵管理は特に慎重に扱うべきである

情報ソース

より詳しくAIに聞いてみよう

  • 暗号化とは何か、初心者でもわかるたとえ話で説明してください。
  • 共通鍵暗号と公開鍵暗号の違いと使い分けを教えてください。
  • 暗号化とハッシュの違いを、パスワード保存を例に説明してください。
  • Node.jsまたはPythonで暗号化を実装するときのベストプラクティスを教えてください。
  • AIに暗号化関連のコードを書いてもらうときの注意点と確認すべきポイントを教えてください。