CodeGym /課程 /SQL SELF /pgcrypto 資料加密入門

pgcrypto 資料加密入門

SQL SELF
等級 48, 課堂 1
開放

你有聽過資料被偷嗎?欸這可不是只有好萊塢電影才會發生的事。公司因為資料外洩損失好幾百萬美金,名聲也像紙牌屋一樣垮掉。為了不讓這種事發生,資料一定要保護好。最強的做法之一就是加密啦。

加密就是把資料變成「祕密代碼」的方法,沒有解密 key 根本看不懂。PostgreSQL 有個超好用的擴充套件叫 pgcrypto,可以讓你很輕鬆地加密你的資料。

pgcrypto 是 PostgreSQL 的一個 extension,提供強大的加密、解密、雜湊還有產生隨機資料的工具。

pgcrypto 的主要功能:

  1. 支援對稱式加密(一把 key)跟非對稱式加密(一對 key:private 跟 public)。
  2. 資料雜湊,像是驗證密碼用的。
  3. 產生隨機資料,可以拿來做 token、key、密碼什麼的。

來看看怎麼在你的資料庫裡裝好 pgcrypto。如果你以前覺得魔法只有霍格華茲的巫師才會用,PostgreSQL 會讓你大開眼界。

-- 安裝 pgcrypto 擴充套件
CREATE EXTENSION IF NOT EXISTS pgcrypto;

對稱式加密:把你的祕密藏起來

加密跟解密的函式:

  1. pgp_sym_encrypt(data, key) — 用對稱 key 加密資料。
  2. pgp_sym_decrypt(data, key) — 用同一把 key 解密資料。

範例:加密純文字

假設我們有個 users 資料表,裡面有 email 欄位,我們想把 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;

小提醒:key 千萬不要亂設。像 "123456" 這種 key 就跟你家門口貼密碼一樣,還直接開門給人進。key 要長又複雜才安全。

資料雜湊:密碼保護超進化

把密碼明碼存資料庫就跟把日記藏在合租公寓的枕頭下一樣,千萬別這樣!要用雜湊才安全。

雜湊函式: crypt(password, gen_salt('bf')) — 用 Blowfish 演算法幫 password 產生雜湊。

-- 密碼雜湊範例
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。

小建議:密碼絕對不要明碼存。就算你覺得資料庫超安全,也一定要用雜湊。

非對稱式加密:兩把 key 比一把還強

非對稱式加密會用到兩把 key:

  1. Public key(加密用)。
  2. Private key(解密用)。

範例:用 public key 加密

-- 產生一對 key(這裡直接存在變數裡)
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 連線就是這樣搞的。

產生隨機資料

要做 token 或隨機 key,可以用 gen_random_uuid 或 gen_random_bytes。

範例:

-- 產生隨機 UUID
SELECT gen_random_uuid();

-- 產生隨機 byte 陣列
SELECT gen_random_bytes(16);

這很適合拿來做唯一識別碼、存取 token 或隨機密碼。

pgcrypto 的應用場景

  1. 加密敏感資料:
  • 信用卡號。
  • 客戶個資(像地址、電話)。
  • 醫療紀錄。
  1. 密碼雜湊: 就算是資料庫管理員也看不到用戶密碼。

  2. 安全傳輸資料: 用非對稱式加密來傳加密資訊。

  3. 產生 token: 做 API 使用者驗證的 token。

加密常見的地雷

把 key 放在大家都找得到的地方。 千萬不要把加密 key 明碼存在資料庫。要用 secrets manager 來存。

用太弱的 key。 key 太短很容易被猜到。

沒必要也加密。 加密會讓資料處理變慢,真的需要才用。

忘記用哪個 key 了。 沒有寫好文件,最後資料解不開就 GG 了。

加密其實不難,重點是要有邏輯地保護你的資料。把 pgcrypto 用進你的專案,資料庫就會變超安全,也更符合現代的安全標準。PostgreSQL 給你所有把資料變成銅牆鐵壁的工具。

2
任務
SQL SELF, 等級 48, 課堂 1
上鎖
使用對稱加密來加密和解密資料
使用對稱加密來加密和解密資料
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION