CodeGym /コース /SQL SELF /pgcryptoによるデータ暗号化入門

pgcryptoによるデータ暗号化入門

SQL SELF
レベル 48, レッスン 1
使用可能

データ流出の話、聞いたことある?あれ、ハリウッド映画だけの話じゃないんだよ。企業はデータ漏洩で何百万ドルも失って、評判も一気に崩れる。そうならないためにも、データは絶対に守らなきゃダメ。最強の方法の一つが暗号化だよ。

暗号化っていうのは、データを「秘密のコード」に変換して、復号キーがないと読めなくする方法なんだ。PostgreSQLにはpgcryptoっていう超便利な拡張機能があって、データの暗号化をめっちゃ簡単にしてくれるよ。

pgcryptoはPostgreSQLの拡張で、データの暗号化・復号化、ハッシュ化、ランダムデータ生成の強力なツールを提供してくれる。

pgcryptoの主な機能:

  1. 対称暗号(1つのキー)と非対称暗号(ペアのキー:秘密鍵と公開鍵)の両方に対応。
  2. データのハッシュ化(例:パスワード検証用)。
  3. トークンやキー、パスワード作成に使えるランダムデータの生成。

自分のDBでpgcryptoを有効にする方法はこれ。もし魔法はホグワーツの魔法使いだけのものだと思ってたら、PostgreSQLが君を驚かせてくれるよ。

-- pgcrypto拡張を有効化
CREATE EXTENSION IF NOT EXISTS pgcrypto;

対称暗号:君の秘密をエンコードしよう

暗号化・復号化のための関数:

  1. pgp_sym_encrypt(data, key) — 対称キーでデータを暗号化する。
  2. pgp_sym_decrypt(data, key) — 同じキーで暗号化されたデータを復号する。

例:シンプルなテキストの暗号化

例えば、usersテーブルにemailカラムがあって、メールアドレスを暗号化したいとするよ。

-- usersテーブルを作成
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email TEXT
);

-- データを挿入
INSERT INTO users (email)
VALUES ('user1@example.com'), ('user2@example.com');

-- データを暗号化
UPDATE users
SET email = pgp_sym_encrypt(email, 'supersecretkey');

-- 結果を確認
SELECT * FROM users;

結果:emailカラムには、意味不明な文字列(暗号化されたテキスト)が保存されてるよ。

データの復号化

元のデータに戻したいときは、pgp_sym_decrypt関数を使うよ。

-- データの復号化
SELECT pgp_sym_decrypt(email::bytea, 'supersecretkey') AS original_email
FROM users;

注意:キーはケチらないで!「123456」みたいなキーは、ドアに鍵かけてドア開けっ放しにするのと同じ。長くて複雑なキーを使おう。

データのハッシュ化:パスワード保護の最強バージョン

パスワードをDBに平文で保存するのは、シェアハウスで日記を枕の下に隠すのと同じ。絶対やめよう!代わりにハッシュ化を使ってね。

ハッシュ化のための関数: crypt(password, gen_salt('bf')) — password文字列をBlowfishアルゴリズムでハッシュ化する。

-- パスワードのハッシュ化例
SELECT crypt('my_password', gen_salt('bf'));

結果はこんな感じ:$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi。

パスワードを検証するには、同じ関数を使う:

-- パスワードの検証
SELECT crypt('my_password', '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi') 
       = '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi';

結果:true。

アドバイス:パスワードは絶対に平文で保存しないで。DBがどんなに安全でも、必ずハッシュを使おう。

非対称暗号:キーは2つあった方がいい

非対称暗号は2つのキーを使うよ:

  1. 公開鍵(暗号化用)。
  2. 秘密鍵(復号用)。

例:公開鍵で暗号化する場合

-- キーペアを作成(簡単のため変数に保存)
DO $$
DECLARE
    public_key TEXT;
    private_key TEXT;
BEGIN
    SELECT pgp_keygen_keys(1024, 'my_passphrase')
    INTO public_key, private_key;

    RAISE NOTICE 'Public Key: %', public_key;
    RAISE NOTICE 'Private Key: %', private_key;
END $$;

非対称暗号の使いどころ

今どきのシステムは、SSL接続みたいにデータ交換で非対称暗号をよく使うよ。

ランダムデータの生成

トークンやランダムキーを作るには、gen_random_uuidやgen_random_bytes関数を使おう。

例:

-- ランダムUUIDの生成
SELECT gen_random_uuid();

-- ランダムバイト配列の生成
SELECT gen_random_bytes(16);

これはユニークIDやアクセストークン、ランダムパスワード作成に便利だよ。

pgcryptoの利用シナリオ

  1. 機密データの暗号化:
  • クレジットカード番号。
  • 顧客の個人情報(住所や電話番号など)。
  • 医療記録。
  1. パスワードのハッシュ化: DB管理者でもユーザーパスワードが見えないようにしよう。

  2. 安全なデータ転送: 非対称暗号を使って暗号化情報をやりとりする。

  3. トークン生成: APIユーザー認証用のトークンを作成する。

暗号化でよくあるミス

キーを誰でも見れる場所に保存しちゃう。暗号化キーをDBに平文で保存しないで。シークレットマネージャーを使おう。

弱いキーを使う。暗号化キーが短すぎると、簡単に破られるよ。

必要ないのに暗号化する。暗号化は処理コストが上がるから、本当に必要なとこだけ使おう。

どのキーを使ったか忘れる。ドキュメントがないと、データを復号できなくなることもあるよ。

暗号化は難しいことじゃなくて、データを守るための当たり前の一歩。pgcryptoをプロジェクトに取り入れて、DBをもっと安全に、そして現代の標準に近づけよう。PostgreSQLなら、君のデータを鉄壁に守るためのツールが全部そろってるよ。

2
タスク
SQL SELF, レベル 48, レッスン 1
ロック未解除
対称暗号化を使ったデータの暗号化と復号化
対称暗号化を使ったデータの暗号化と復号化
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION