Python
合規與資料保護:讓合規不是限制,而是你的護身符
合規與資料保護:讓合規不是限制,而是你的護身符
你有沒有想過,你寫的程式裡,那張存著用戶 email 和電話的資料表,萬一哪天被駭客整包搬走,會發生什麼事?合規不是法務部門的事,是你在下第一行程式碼之前就該想清楚的設計問題。事後補合規,代價永遠比一開始就設計好高出許多。
這一課帶你把台灣個資法、GDPR、稽核日誌和資料加密這幾件事,變成你寫程式時的直覺反應:蒐集資料前先問「這個欄位真的需要嗎」,寫入資料庫前先問「這個操作有沒有留下紀錄」,存敏感欄位前先問「這個要不要加密」。
你將學到什麼
台灣個資法五大義務
蒐集目的、告知義務、當事人權利、安全維護、保存期限,每一項都對應到程式裡的具體要求。
GDPR 六大原則
有歐洲用戶就得懂的規則,一張表看懂合法性、最小化、儲存限制怎麼落地成程式設計。
稽核日誌怎麼寫
用 Python logging 記錄誰在何時做了什麼,出事時才有東西可以還原真相。
用 Fernet 加密敏感欄位
資料庫備份被偷、硬碟遺失,加密能讓這些事件不會演變成個資外洩事件。
合規不是限制,是你的護身符
收集台灣用戶個資,你就受個資法約束;有歐洲用戶,你就受 GDPR 約束。法規不是選配項目,而違反法規的罰款,遠遠超過把合規設計進架構的開發成本。這一課要讓你養成四個習慣:蒐集個資前先確認目的、寫入操作前先留下稽核紀錄、敏感欄位存進資料庫前先加密、資料保存到期就清理或匿名化。
- 法規不是選配:收集台灣用戶個資受個資法約束,有歐洲用戶則受 GDPR 約束,違反的罰款遠超開發成本。
- 合規要從架構設計開始:事後補合規,比從一開始就設計合規貴上許多;需求階段就該問「這些資料有沒有合規問題」。
- 日誌稽核是必備工具:誰在什麼時間做了什麼?有完整的稽核日誌,你才能在出問題時還原事實。
- 加密保護靜態資料:資料庫備份被盜、硬碟遺失,加密能讓這些事件不會演變成個資外洩事件。
9-1 台灣個資法基礎
《個人資料保護法》規範所有涉及個人資料的蒐集、處理、利用。開發任何收集用戶資料的系統前,你必須先問清楚下面這五件事,各自對應到程式裡具體要做到的地方。
| 義務 | 說明 | AI 程式要求 |
|---|---|---|
| 蒐集目的 | 蒐集前需指定目的,不能超範圍使用 | 程式說明中標明資料用途 |
| 告知義務 | 蒐集前必須告知當事人 | UI 必須有隱私政策連結 |
| 當事人權利 | 查詢、更正、刪除、停止使用 | 程式必須支援刪除操作 |
| 安全維護 | 防止個資被竊取或洩漏 | 加密、存取控制、稽核日誌 |
| 保存期限 | 目的達成後應刪除或匿名化 | 排程清理過期資料 |
給 AI 的個資保護提示詞
9-2 GDPR 六大原則(簡明版)
歐盟 GDPR 適用於任何處理歐盟居民個資的組織,不論你的公司在哪個國家。只要產品有歐洲用戶,你就必須遵守。下面這張表把六大原則翻成程式實作上該做的事。
| 原則 | 核心要求 | 程式實作要點 |
|---|---|---|
| 合法性 | 必須有合法依據才能處理個資(同意、合約、法律義務) | 同意記錄要存入資料庫 |
| 目的限制 | 蒐集目的外不可另作他用 | 資料欄位加目的標籤 |
| 最小化 | 只蒐集必要的資料 | API 設計不回傳不必要欄位 |
| 正確性 | 確保資料準確並可更新 | 支援更新與版本紀錄 |
| 儲存限制 | 過了保存期限要刪除或匿名化 | 排程清理加上匿名化函式 |
| 完整性與保密性 | 確保安全,防止未授權存取 | 加密、存取控制、日誌 |
9-3 日誌稽核:記錄誰在何時做了什麼
稽核日誌(Audit Log)是合規的核心工具,也是出問題時還原事實的唯一依據。所有涉及個資的操作,都應該寫入稽核日誌。下面示範一支獨立的稽核 logger,加上一個共用的 log_action() 函式。
import logging, datetime, json
# 設定獨立的稽核 logger
audit_logger = logging.getLogger("audit")
audit_handler = logging.FileHandler("audit.log", encoding="utf-8")
audit_logger.addHandler(audit_handler)
audit_logger.setLevel(logging.INFO)
def log_action(user_id: str, action: str, target: str,
details: dict = None) -> None:
""" 寫入一筆稽核記錄。 """
record = {
"timestamp": datetime.datetime.utcnow().isoformat() + "Z",
"user_id": user_id,
"action": action, # CREATE / READ / UPDATE / DELETE
"target": target, # 操作的資源,如 "user:42"
"details": details or {}
}
audit_logger.info(json.dumps(record, ensure_ascii=False))
# 使用範例
log_action("admin_01", "DELETE", "user:123",
{"reason": " 用戶申請刪除帳號 "})
9-4 資料加密:靜態加密與傳輸加密
靜態資料加密(Fernet 對稱加密)
Fernet 是 cryptography 套件提供的對稱加密方案,加密後可以解密還原成明文,適合用來保護資料庫裡的敏感欄位。金鑰要存進環境變數,絕對不要寫死在程式碼裡。
from cryptography.fernet import Fernet # pip install cryptography
import os
# 一次性生成金鑰(存到 .env,不要寫死)
key = Fernet.generate_key()
cipher = Fernet(os.getenv("FERNET_KEY").encode())
# 加密
def encrypt(plaintext: str) -> str:
return cipher.encrypt(plaintext.encode("utf-8")).decode()
# 解密
def decrypt(ciphertext: str) -> str:
return cipher.decrypt(ciphertext.encode()).decode("utf-8")
# 範例:加密存入資料庫,讀取時解密
email_enc = encrypt("alice@example.com")
# cursor.execute("INSERT INTO users VALUES (?)", (email_enc,))
email_plain = decrypt(email_enc)
| 場景 | 方法 | 說明 |
|---|---|---|
| 資料庫敏感欄位 | Fernet 對稱加密 | 應用層加密,加密後再存入 |
| API 傳輸 | HTTPS(TLS) | 部署時配置,不需在程式碼處理 |
| 備份檔案 | AES 256 加密 | 備份前加密,金鑰分開保管 |
| 密碼 | bcrypt 雜湊 | 單向加密,無法解密還原 |
作業:三道遞進題,讀懂、改寫、抓錯
題目一:讀懂(基礎)
說明以下稽核日誌系統的設計理念。
import logging, datetime, json
audit = logging.getLogger("audit")
audit.addHandler(logging.FileHandler("audit.log", encoding="utf-8"))
audit.setLevel(logging.INFO)
def log_action(uid, action, target, before=None, after=None):
audit.info(json.dumps({
"ts": datetime.datetime.utcnow().isoformat() + "Z",
"uid": uid,
"action": action,
"target": target,
"before": before,
"after": after
}, ensure_ascii=False))
log_action("u001", "UPDATE", "user:42",
before={"email": "old@x.com"},
after ={"email": "new@x.com"})
任務:說明為什麼要用 UTC 時間、為什麼記錄 before 和 after、以及 ensure_ascii=False 的作用。
二、記錄 before 和 after,讓稽核人員能看到「什麼被改了」,是追蹤資料變更的關鍵,也是還原資料的依據。
三、
ensure_ascii=False 讓 JSON 輸出直接顯示中文,而不是 \uXXXX 跳脫序列,日誌可讀性大幅提升。題目二:改寫(進階)
請 AI 把以下用戶管理系統升級為合規版本。
import sqlite3
def create_user(name, email):
with sqlite3.connect("users.db") as conn:
conn.execute(
"INSERT INTO users (name, email) VALUES (?, ?)",
(name, email)
)
conn.commit()
cipher.encrypt(email.encode()) 後再存,讀取時解密,金鑰存在 .env。二、
delete_user(user_id) 支援 GDPR 的被遺忘權:用 DELETE FROM users WHERE id 為問號佔位,並寫入稽核日誌。三、每次操作呼叫
log_action(operator_id, "CREATE", f"user:{新 id}") 就能形成完整的操作軌跡。題目三:抓錯(高階)
合規問題往往不是「程式會崩潰」,而是「程式能跑但違法」,這類錯誤在 code review 時最容易被忽略。
import sqlite3, logging
logging.basicConfig(level=logging.DEBUG)
def get_all_users():
""" 取得所有用戶資料(供報表使用)。 """
with sqlite3.connect("users.db") as conn:
conn.row_factory = sqlite3.Row
cur = conn.cursor()
cur.execute("SELECT id, name, email, phone, ssid FROM users")
return [dict(row) for row in cur.fetchall()]
# 呼叫後直接 print 到 log
users = get_all_users()
logging.debug(f" 報表資料:{users} ")
任務:找出四個合規問題,說明各自違反了哪個原則。
logging.debug(users) 把完整個資(包含 email、phone、ssid)寫入 log 檔,違反保密原則。get_all_users() 取得所有用戶資料,違反存取最小化。術語速查表
| 術語 | 說明 |
|---|---|
個資法 | 台灣《個人資料保護法》,規範個資蒐集、處理、利用的基本法律。 |
GDPR | 歐盟《通用資料保護規則》,適用於處理歐盟居民個資的所有組織,不限所在地。 |
個人資料 | 能直接或間接識別特定自然人的資訊,如姓名、Email、身分證字號、IP 位址等。 |
蒐集目的 | 蒐集個資時必須聲明的用途,且不能超出此目的使用(目的限制原則)。 |
最小化原則 | 只蒐集達成目的所必要的最少資料量,多餘欄位不應蒐集。 |
被遺忘權 | GDPR 賦予用戶要求刪除其個人資料的權利,系統必須提供刪除功能。 |
稽核日誌 | 記錄所有資料操作的日誌,包含時間戳記、操作者、動作、對象。 |
UTC 時間 | 協調世界時,稽核日誌應使用 UTC 避免時區混淆,格式為 ISO 8601。 |
Fernet | Python cryptography 套件提供的對稱加密方案,適合加密資料庫敏感欄位。 |
靜態加密 | 對存儲中的資料加密,防止儲存媒介(硬碟、備份)被盜時資料外洩。 |
傳輸加密 | 對網路傳輸中的資料加密,部署時由伺服器設定,不需在應用程式碼處理。 |
匿名化 | 將個資移除或替換成無法識別個人的形式,匿名化後不再受個資法規範。 |
重點整理與完成清單
| 項目 | 實作方式 |
|---|---|
| 蒐集告知 | 隱私政策頁面加上同意記錄 |
| 目的限制 | API 只回傳必要欄位(最小化) |
| 刪除權利 | delete_user(id) 函式 |
| 敏感欄位保護 | Fernet 加密存儲 |
| 操作可追溯 | 稽核日誌(時間、人、動作、對象) |
模組九完成清單
- 了解台灣個資法的五大義務:蒐集目的、告知、權利、安全、保存期限。
- 了解 GDPR 六大原則,知道何時適用。
- 能實作稽核日誌,包含 UTC 時間、操作者、動作、對象、前後值。
- 能用 Fernet 加密資料庫敏感欄位。
- 完成作業題目一:說明 UTC 時間、before/after、ensure_ascii 的作用。
- 完成作業題目二:請 AI 升級系統,達到合規標準。
- 完成作業題目三:找出最小化、保密、存取控制、稽核四個問題。
延伸學習
HE201|Harness Engineering System Design(6 小時)
六小時的實作課:從 Blueprint 走到可以跑的規格,再用 No-code、n8n 低程式碼與程式碼三條路各做一次同一個 harness,最後處理可靠度——重試、錯誤處理、人工覆核。7 章 54 課,含常見坑與排錯、Capstone 實作,附學員講義 PDF。
NT$ 5,999
AI Native 工作法
四小時完整實錄。工作已經不是以前的工作了 ── 這門課拆解 AI Native 的四個核心能力,帶你把自己的工作做成一份可執行的 AI Native Blueprint,從「會用 AI 的人」變成「工作本身就長在 AI 上的人」。
NT$ 2,599

