データ流出の話、聞いたことある?あれ、ハリウッド映画だけの話じゃないんだよ。企業はデータ漏洩で何百万ドルも失って、評判も一気に崩れる。そうならないためにも、データは絶対に守らなきゃダメ。最強の方法の一つが暗号化だよ。
暗号化っていうのは、データを「秘密のコード」に変換して、復号キーがないと読めなくする方法なんだ。PostgreSQLにはpgcryptoっていう超便利な拡張機能があって、データの暗号化をめっちゃ簡単にしてくれるよ。
pgcryptoはPostgreSQLの拡張で、データの暗号化・復号化、ハッシュ化、ランダムデータ生成の強力なツールを提供してくれる。
pgcryptoの主な機能:
- 対称暗号(1つのキー)と非対称暗号(ペアのキー:秘密鍵と公開鍵)の両方に対応。
- データのハッシュ化(例:パスワード検証用)。
- トークンやキー、パスワード作成に使えるランダムデータの生成。
自分のDBでpgcryptoを有効にする方法はこれ。もし魔法はホグワーツの魔法使いだけのものだと思ってたら、PostgreSQLが君を驚かせてくれるよ。
-- pgcrypto拡張を有効化
CREATE EXTENSION IF NOT EXISTS pgcrypto;
対称暗号:君の秘密をエンコードしよう
暗号化・復号化のための関数:
pgp_sym_encrypt(data, key)— 対称キーでデータを暗号化する。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つのキーを使うよ:
- 公開鍵(暗号化用)。
- 秘密鍵(復号用)。
例:公開鍵で暗号化する場合
-- キーペアを作成(簡単のため変数に保存)
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の利用シナリオ
- 機密データの暗号化:
- クレジットカード番号。
- 顧客の個人情報(住所や電話番号など)。
- 医療記録。
パスワードのハッシュ化: DB管理者でもユーザーパスワードが見えないようにしよう。
安全なデータ転送: 非対称暗号を使って暗号化情報をやりとりする。
トークン生成: APIユーザー認証用のトークンを作成する。
暗号化でよくあるミス
キーを誰でも見れる場所に保存しちゃう。暗号化キーをDBに平文で保存しないで。シークレットマネージャーを使おう。
弱いキーを使う。暗号化キーが短すぎると、簡単に破られるよ。
必要ないのに暗号化する。暗号化は処理コストが上がるから、本当に必要なとこだけ使おう。
どのキーを使ったか忘れる。ドキュメントがないと、データを復号できなくなることもあるよ。
暗号化は難しいことじゃなくて、データを守るための当たり前の一歩。pgcryptoをプロジェクトに取り入れて、DBをもっと安全に、そして現代の標準に近づけよう。PostgreSQLなら、君のデータを鉄壁に守るためのツールが全部そろってるよ。
GO TO FULL VERSION