iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0

在之前的章節中,我們了解了像HTTPS、OAuth 2.0、SAML 和 OIDC 這些重要的安全協議和標準。今天,我想記錄一下這些協議背後的安全技術:加密機制,描述如何通過加密來保障數據在傳輸過程中敏感資訊免受未經授權的訪問、竊聽、修改或偽造。

簡易加密流程示意

先用一張簡易的圖來闡述簡單的加密流程,如下,

https://ithelp.ithome.com.tw/upload/images/20240925/201158957MjWkOpTcH.png

左側的明文(Plaintext)是未加密的數據,為加密過程的輸入,表示想保護的敏感信息。圖中的紅色鎖頭代表加密過程。在這一階段,明文會被轉換成密文(Ciphertext),中間的黃線表示加密後的數據傳輸。在傳輸過程中是不可讀的,只有擁有正確密鑰的人才能解密(後續會提到)。右側的鑰匙和藍色框代表解密過程。通過使用密鑰(Key),密文被轉換回原始的明文,這樣只有授權的接收者可以讀取數據。上述簡單的流程闡述完,稍微整理幾個重要名詞概念

  • 明文(Plaintext):加密前的原始信息,也就是希望保護的數據。在加密過程中,明文會被轉換成不可讀的形式,也就是密文。
  • 密文(Ciphertext):這是明文經過加密後的結果。密文通常看起來是隨機的,並且不能被輕易理解,除非你有正確的密鑰來解密。
  • 密鑰(Key):這是加密和解密過程中使用的一種參數。密鑰的選擇決定了明文如何被轉成密文,以及如何將密文解密回明文。

加密機制的運作方式

那實際的加解密是如何實作的? 核心在於將明文通過數學算法密鑰轉換為不可讀的密文,以確保數據在傳輸和存儲過程中的安全性。這一過程是通過複雜的**密碼編譯數學模型**來實作。

在加解密過程中,Key的生成取決於所使用的加密演算法和應用場景。一般來說,Key是由隨機數生成器(Random Number Generator, RNG)或更安全的密碼學隨機數生成器(Cryptographic Secure Random Number Generator, CSRNG)來產生。Key須具備以下特質

  • 隨機性:Key通常需要具備高隨機性,以防止攻擊者通過猜測或暴力破解。對稱加密使用的Key(如AES的Key)通常是128位、192位或256位的二進制數字,非對稱加密(如RSA)中的私鑰和公鑰則是由複雜的數學算法(如大素數運算)生成。
  • Key的強度:Key的長度越大,暴力破解難度越高。以AES為例,128位的Key大約有$2^{128}$種可能的組合,這對於目前的計算能力來說幾乎不可破解。

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呢? 接下來就來細談加解密過程

對稱加密(Symmetric Encryption)

使用單一的密鑰進行加密和解密操作,著加密和解密雙方必須共用相同的Key。演算法常見的有AES(Advanced Encryption Standard)DES(Data Encryption Standard)

流程如下

https://ithelp.ithome.com.tw/upload/images/20240925/20115895QkrJmaF9p8.png

  • 加密過程 :
    • 數據的明文(Plaintext)會通過一個加密演算法(Encryption)和事先生成的對稱密鑰進行運算。
    • 演算法根據密鑰將明文轉換為不可讀的密文(Chiphertext)。
  • 解密過程
    • 收到密文後,擁有相同密鑰的接收方使用相同的算法進行解密(Decryption)。
    • 演算法通過密鑰將密文(Ciphertext)還原為可讀的明文(Plaintext)。

AES演算法請參考 (請點我),我覺得是很有趣的東西,再找時間整理。操作流程大概是:先將明文與初始金鑰進行異或運算(AddRoundKey),接著進入多輪加密,每輪包括字節代換(SubBytes)、列位移(ShiftRows)、行混合(MixColumns)和再一次的異或運算(AddRoundKey),最後一輪省略行混合,最終產生密文。每一輪使用的金鑰都從初始金鑰擴展生成,通過這些步驟,明文會被轉換成難以破解的密文。

對稱加密因為加解密是相同鑰匙運算過程簡單,所以它的優點是速度快、效率高,尤其在處理大量數據時具有明顯優勢,但缺點是密鑰的分發問題,必須確保加密雙方能夠安全地共享同一密鑰。

非對稱加密(Asymmetric cryptography)

使用兩個不同的密鑰:公鑰(Public Key)私鑰(Private Key)。其中公鑰是公開的,任何人都可以使用它來加密信息,而私鑰則需要保密,只有私鑰持有者才能解密加密的信息。常見的非對稱加密算法有RSA(Rivest-Shamir-Adleman)與ECC(Elliptic Curve Cryptography)

流程如下
https://ithelp.ithome.com.tw/upload/images/20240925/20115895B5pvuE8Z40.png

  • 加密過程 :
    • 發送者使用接收者提供的公鑰(Public Key)來加密明文資料。這個公鑰可以公開,任何人都能使用它來加密資料。
    • 演算法根據密鑰將明文轉換為不可讀的密文(Chiphertext)。
  • 解密過程
    • 收到密文後,接收方使用私鑰(Private Key)來解密。
    • 演算法通過密鑰將密文(Ciphertext)還原為可讀的明文(Plaintext)。

基本上無論是加密還是解密,都是基於同一套算法框架。RSA算法(請點我)再找時間整理。以上描述就不帶程式碼了,因為AI產Code特別快,另外目前自己有手刻的是C#,不符合Quarkus的主題。

淺談TLS實作

大致理解加密流程後,還記得TLS嗎? 讓我們回憶一下網路協議架構如下圖

https://ithelp.ithome.com.tw/upload/images/20240925/20115895VrbxJzJKUv.png

加解密操作主要發生在TLS層(Transport Layer Security)。這個層位於應用層(HTTP)之下和傳輸層(TCP)之上。之前在看這張圖時其實沒有意識到它是一個協議框架,分別由硬體與軟體去實作

  • Physical Layer(實體層):負責網路硬體的bit傳輸(電纜、光纖、無線電波)。
  • Data Link Layer(資料連結層):負責局部網路中的資料傳輸與錯誤檢測,涉及網卡(NIC)。
  • Network Layer(網路層,IP):由作業系統的網路協定堆疊實作,應用程式通常不直接操作。

以下為軟體高層開發者程式面會碰觸到的部分

  • Transport Layer(傳輸層,TCP):由作業系統實作,負責端到端資料傳輸。應用程式透過 socket API 與此層互動,不需要直接實作 TCP 協定。
  • TLS Layer(TLS 層):由加密函式庫(如 OpenSSL、mbedTLS)實作,應用程式透過它來實現加密、資料完整性和身份驗證。
  • Application Layer(應用層,HTTP):由應用程式直接實作,負責應用邏輯,如使用 HTTP 函式庫處理請求與回應。

基本上對稱加密與非對稱加密的程式實作,嚴格講起來具體其實是實作在應用層。而交換Key加解密的過程,其實就是Application Layer與TLS層互動的過程(可參考SSL/TLS章節)。

其餘加密

雜湊加密**(Hash function)**

除了前面提到的加密方式,另一個常見的技術是雜湊函式。它的運作原理是將明文輸入一個特定的演算法,產生出一串固定長度的雜湊值(也稱為摘要)。這種方法操作起來相對簡單。無論輸入的內容長短如何,經過雜湊演算法(如 SHA 系列、BLAKE2)處理後,都會得到固定長度的輸出值。

須注意的是,雜湊是單向運算,無法從雜湊值反推回原始資料。這個特性,雜湊函式常被用於儲存敏感資訊(例如密碼):即使駭客取得了雜湊值,他們也無法從中還原出原始的敏感資料。下圖為雜湊函式(Hash function)的運作方式

https://ithelp.ithome.com.tw/upload/images/20240925/20115895RHsBeZUo4N.png

  1. 「Fox」經過雜湊函式處理後得到雜湊值:DFCD3454
  2. 「The red fox runs across the ice」經過雜湊函式處理後得到雜湊值:52ED879E
  3. …省略

可以觀察到第二和第三行的輸入只有一字之差(runs 和 walks),但產生的雜湊值完全不同。輸入的細微變化如何導致完全不同的雜湊結果。這些特性使得雜湊函式在資料完整性驗證、密碼儲存等領域非常有用。

保存建議

最後談一下Key值的保存方式,大致有下述幾種

  • 密鑰管理服務 :

    • 密鑰管理服務:管理密鑰的雲服務,例如 AWS Key Management Service (KMS) 或 Google Cloud KMS。這些服務提供了一個中心化、安全的地方來創建、存儲和管理密鑰。

    • 秘密管理服務:這是另一種雲服務,專門用於存儲任何形式的敏感數據,包括密鑰,例如 AWS Secrets Manager 或 Google Secret Manager。

    • 硬件安全模塊(HSM):一種專門的硬體設備,用於安全地生成、存儲和使用密鑰。HSM可以提供最高等級的安全性,但也有較高的成本。

  • DB : 對於需要追蹤加密作業的系統,可以使用資料庫來儲存加密相關的中繼資料,以下是建議的資料表結構

  • 加密作業表

    • 作業編號: UUID,唯一識別每次加密作業
    • 時間戳記: TIMESTAMP,加密作業執行的時間
    • 金鑰識別碼: VARCHAR,用於指向金鑰管理系統中實際金鑰的識別碼
    • 初始向量: BLOB,該次加密使用的初始向量
    • 演算法: VARCHAR,使用的加密演算法(例如 AES-256-GCM)
    • 資料參照: VARCHAR,指向被加密資料的參照(如檔案路徑或資料庫記錄 ID)
  • 金鑰版本表

    • 金鑰編號: UUID,金鑰的唯一識別碼
    • 版本: INT,金鑰的版本號
    • 建立日期: TIMESTAMP,金鑰版本建立時間
    • 狀態: ENUM('使用中', '已封存', '已洩漏'),金鑰目前狀態

加密作業表用於記錄每次加密操作的詳細資訊,方便追蹤和稽核;而金鑰版本表則用於管理不同版本的加密金鑰,支援金鑰輪替和生命週期管理。(這是中繼表,建議實際金鑰應存放在專門的金鑰管理系統)

  • 雲端空間(不推薦) : 直接用File存取

上一篇
開發觀念建置-關於身分識別授權流程
下一篇
開發觀念建置-微服務中的資料庫權限管理:服務即使用者
系列文
微服務奇兵:30天Quarkus特訓營25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言