在之前的章節中,我們了解了像HTTPS、OAuth 2.0、SAML 和 OIDC 這些重要的安全協議和標準。今天,我想記錄一下這些協議背後的安全技術:加密機制,描述如何通過加密來保障數據在傳輸過程中敏感資訊免受未經授權的訪問、竊聽、修改或偽造。
先用一張簡易的圖來闡述簡單的加密流程,如下,
左側的明文(Plaintext)
是未加密的數據,為加密過程的輸入,表示想保護的敏感信息。圖中的紅色鎖頭代表加密過程。在這一階段,明文會被轉換成密文(Ciphertext)
,中間的黃線表示加密後的數據傳輸。在傳輸過程中是不可讀的,只有擁有正確密鑰的人才能解密(後續會提到)。右側的鑰匙和藍色框代表解密過程。通過使用密鑰(Key),密文被轉換回原始的明文,這樣只有授權的接收者可以讀取數據。上述簡單的流程闡述完,稍微整理幾個重要名詞概念
那實際的加解密是如何實作的? 核心在於將明文通過數學算法
和密鑰
轉換為不可讀的密文,以確保數據在傳輸和存儲過程中的安全性。這一過程是通過複雜的**密碼編譯數學模型
**來實作。
在加解密過程中,Key的生成取決於所使用的加密演算法和應用場景。一般來說,Key是由隨機數生成器(Random Number Generator, RNG)
或更安全的密碼學隨機數生成器(Cryptographic Secure Random Number Generator, CSRNG)
來產生。Key須具備以下特質
AES-128位元可能的組合大約是 340,282,366,920,938,463,463,374,607,431,768,211,456,約 3.4 x 10^{38}。
無意間看到一個有趣的亂數產生器叫True Random Number Generator (TRNG),它是基於物理現象(硬體)的亂數生成方法。比如電訊號的隨機震盪或其他物理現象來生成亂數。蠻特別的..隨手記錄一下
Key大致理解後,那加解密過程是如何運用這些Key呢? 接下來就來細談加解密過程
使用單一的密鑰進行加密和解密操作,著加密和解密雙方必須共用相同的Key。演算法常見的有AES(Advanced Encryption Standard)
、DES(Data Encryption Standard)
流程如下
AES演算法請參考 (請點我),我覺得是很有趣的東西,再找時間整理。操作流程大概是:先將明文與初始金鑰進行異或運算(AddRoundKey),接著進入多輪加密,每輪包括字節代換(SubBytes)、列位移(ShiftRows)、行混合(MixColumns)和再一次的異或運算(AddRoundKey),最後一輪省略行混合,最終產生密文。每一輪使用的金鑰都從初始金鑰擴展生成,通過這些步驟,明文會被轉換成難以破解的密文。
對稱加密因為加解密是相同鑰匙運算過程簡單,所以它的優點是速度快、效率高,尤其在處理大量數據時具有明顯優勢,但缺點是密鑰的分發問題,必須確保加密雙方能夠安全地共享同一密鑰。
使用兩個不同的密鑰:公鑰(Public Key)
和私鑰(Private Key)
。其中公鑰是公開的,任何人都可以使用它來加密信息,而私鑰則需要保密,只有私鑰持有者才能解密加密的信息。常見的非對稱加密算法有RSA(Rivest-Shamir-Adleman)
與ECC(Elliptic Curve Cryptography)
。
流程如下
基本上無論是加密還是解密,都是基於同一套算法框架。RSA算法(請點我)再找時間整理。以上描述就不帶程式碼了,因為AI產Code特別快,另外目前自己有手刻的是C#,不符合Quarkus的主題。
大致理解加密流程後,還記得TLS嗎? 讓我們回憶一下網路協議架構如下圖
加解密操作主要發生在TLS層(Transport Layer Security)。這個層位於應用層(HTTP)之下和傳輸層(TCP)之上。之前在看這張圖時其實沒有意識到它是一個協議框架,分別由硬體與軟體去實作
以下為軟體高層開發者程式面會碰觸到的部分
基本上對稱加密與非對稱加密的程式實作,嚴格講起來具體其實是實作在應用層。而交換Key加解密的過程,其實就是Application Layer與TLS層互動的過程(可參考SSL/TLS章節)。
除了前面提到的加密方式,另一個常見的技術是雜湊函式。它的運作原理是將明文輸入一個特定的演算法,產生出一串固定長度的雜湊值(也稱為摘要)。這種方法操作起來相對簡單。無論輸入的內容長短如何,經過雜湊演算法(如 SHA 系列、BLAKE2)處理後,都會得到固定長度的輸出值。
須注意的是,雜湊是單向運算,無法從雜湊值反推回原始資料。這個特性,雜湊函式常被用於儲存敏感資訊(例如密碼):即使駭客取得了雜湊值,他們也無法從中還原出原始的敏感資料。下圖為雜湊函式(Hash function)的運作方式
可以觀察到第二和第三行的輸入只有一字之差(runs 和 walks),但產生的雜湊值完全不同。輸入的細微變化如何導致完全不同的雜湊結果。這些特性使得雜湊函式在資料完整性驗證、密碼儲存等領域非常有用。
最後談一下Key值的保存方式,大致有下述幾種
密鑰管理服務 :
密鑰管理服務:管理密鑰的雲服務,例如 AWS Key Management Service (KMS) 或 Google Cloud KMS。這些服務提供了一個中心化、安全的地方來創建、存儲和管理密鑰。
秘密管理服務:這是另一種雲服務,專門用於存儲任何形式的敏感數據,包括密鑰,例如 AWS Secrets Manager 或 Google Secret Manager。
硬件安全模塊(HSM):一種專門的硬體設備,用於安全地生成、存儲和使用密鑰。HSM可以提供最高等級的安全性,但也有較高的成本。
DB : 對於需要追蹤加密作業的系統,可以使用資料庫來儲存加密相關的中繼資料,以下是建議的資料表結構
加密作業表
金鑰版本表
加密作業表用於記錄每次加密操作的詳細資訊,方便追蹤和稽核;而金鑰版本表則用於管理不同版本的加密金鑰,支援金鑰輪替和生命週期管理。(這是中繼表,建議實際金鑰應存放在專門的金鑰管理系統)