iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0
Security

醫療數據的資安挑戰與創新解決方案系列 第 16

病歷欄位加密 – 查詢與解密資料

  • 分享至 

  • xImage
  •  

今日學習目標是學會如何從 MySQL 查詢加密病歷資料,並在應用端使用密鑰解密,讓醫師可以安全地讀取病歷資訊。

一、理論重點

  1. 從資料庫取出的欄位為加密資料。
  2. 需要使用與加密時相同的密鑰解密。
  3. 可與角色權限控管結合,確保只有授權角色能解密與查看資料。

二、案例分享

2021年,「健安醫院」醫師查詢病歷流程也進行改造:系統要求醫師登入後,透過個人授權金鑰解密欄位資料。
一次模擬測試中,醫師 A 嘗試查詢病人血壓與診斷資料,系統先回傳加密欄位,醫師端應用程式才利用密鑰解密成明文顯示。若其他角色(護理師 B 或外部人員)無權限,即使登入資料庫也只能看到加密資料,無法解密。這套流程不僅符合 HIPAA 與個資保護規範,也大幅降低病歷外洩風險。

三、簡單程式示範

# day16_decrypt_records.py
import mysql.connector
from cryptography.fernet import Fernet

# ====== 1. 使用同一個 key ======
key = b"r7HYLmg9nM7SGtk20lr5Ywk8jlVREpUP9vWVHszw6Nc="  # 從 Day15 的輸出貼上
cipher = Fernet(key)

# ====== 2. 連線到 MySQL ======
conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="我的密碼",
    database="health"
)
cur = conn.cursor()

# ====== 3. 查詢並解密病歷資料 ======
cur.execute("SELECT id, patient_name, diagnosis, vitals FROM patient_records")
print("查詢明文病歷及解密結果:")
for row in cur.fetchall():
    dec_name = cipher.decrypt(row[1]).decode()
    dec_diag = cipher.decrypt(row[2]).decode()
    dec_vitals = cipher.decrypt(row[3]).decode()
    print(f"ID:{row[0]} 病患 {dec_name} - 診斷: {dec_diag} - 生命徵象: {dec_vitals}")

conn.close()
print("\n解密查詢完成!")


解密成功後結果如下圖

https://ithelp.ithome.com.tw/upload/images/20250918/20169331HTbfMZLBQx.png


上一篇
病歷欄位加密 – 插入加密資料
系列文
醫療數據的資安挑戰與創新解決方案16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言