摘要密碼學與資訊安全
整理一些 密碼學 (Cryptography) 與 資訊安全 (Information Security) 的專有名詞、重要概念、密碼學演算法、應用協議、資訊安全概念,主要資料都參考自 Wikipedia。
- 本文非一次性整理,相關筆記漸進式整理上來。
- 本文只是個人學習的梳理,可能有誤,如有建議歡迎給予指導,感謝。
一、專有名詞與重要概念
專有名詞的寫法統一格式:縮寫, 英文原文 - 中文翻譯
- cryptography: 密碼學
- cryptographic algorithms: 加密演算法
- symmetric encryption: 對稱式加密
- asymmetric encryption: 非對稱式加密, 一對金鑰,分別是
Private Key (私鑰)
以及Public Key (公鑰)
- encrypt: 加密
- decrypt: 解密
- key: 一般來說都翻譯成
金鑰
,類似於真實世界的鑰匙概念。 - plaintext: 明文, 尚未經過加密處理的原始資料。
- ciphertext: 密文, 明文經過加密演算法所產生的
- digital signature: 數位簽章
- DSA, Digital Signature Algorithm 數位簽章演算法
- OTP, one-time pad 一次性密碼
- brute-force attacks 暴力攻擊
Public Key Infrastructure, PKI
Public Key Infrastructure, PKI, 公開金鑰基礎建設: 又稱公開金鑰基礎架構、公鑰基礎建設、公鑰基礎設施、公開密碼匙基礎建設或公鑰基礎架構,是一組由硬體、軟體、參與者、管理政策與流程組成的基礎架構,其目的在於創造、管理、分配、使用、儲存以及復原 數位憑證
。
簡單說,PKI 的目的是:
如何確認我拿到的 Public Key 真的是對方發的 Public Key?
由以下成分組成:
- 用戶: 使用 PKI 的人或機構
- CA (Certification Authority, 認證機構): 頒發憑證的人或機構
- Repository: 儲存憑證 (Certificate) 的資料庫
Public Key Certificate
Public Key Certificate 公開金鑰認證, 又稱 數位憑證 (Digital Certificate
)或 身份憑證(Identity Certificate)
。用來證明擁有 公開金鑰
的身份數位識別,這個識別裡必須包含 公鑰資訊
、擁有者身份
、數為憑證認證機構
,也就是 (用戶 Public Key + 識別資訊) + (CA Public Key) + CA 資訊
- 電子憑證的儲存形式,常見的有兩種:
- PEM:全名
Privacy Enhance Mail
,ASCII 使用 Base64 編碼後的憑證。 - DER:全名
Distinguished Encoding Rules
,二進位編碼的憑證,通常以.cer
、.crt
、.der
檔案出現。
- PEM:全名
- 把憑證跟私鑰一起儲存,則使用
PKCS#12 (.p12)
格式 - 憑證種類:自簽憑證、根憑證、中介憑證、授權憑證、終端實體憑證 (TLS 伺服器憑證、萬用字元憑證、TLS 客戶端憑證)
X.509
:一種廣泛使用的憑證標準格式,v3 的標準是 RFC 5280- CSR:
Certificate Signing Request
憑證簽章請求
- CSR:
Process of Digital Certificate
下圖是數位簽章的工作流程,分成兩個部分:
上圖左邊 Sender 的部分,也就是想要傳送資料的人,步驟如下:
- Sender 使用雜湊演算法 (Hashing algorithms),計算待傳送資料 (Data) 的雜湊值 (Hash)
- 常見的 雜湊演算法:MD5、SHA-family
- 可以透過
openssl dgst -h
找到相關的演算法。 - 這個雜湊值也稱為
指紋 (Fingerprint)
- Sender 用自己的
私鑰 (PrivateKey)
對步驟 1) 的 Fingerprint 進行加密,產生簽章 (Signature)
- 這個動作叫做
簽名 (Signing)
,用來代表證明是 Sender 送過去的認證
- 這個動作叫做
- Sender 將 (簽章和原始資料) 寄給 Receiver.
- Sender 應該要透過其他方式,對其他人 (包含 Receiver) 公開公鑰 (PublicKey)
- Data + Signature 稱為
數位簽章資料(Digitally signed data)
這個過程用 openssl
範例如下:
1 | # 原始資料 (Data) |
寫成 psudo code 大概長這樣:
1 | Fingerprint = Hash(Data, HashFunction); |
上圖右邊 Receiver 的部分,接收到資料後,確認是 Sender 寄來的過程:
- Receiver 會收到 Sender 寄來的 Data + Signature 兩個東西。
- Receiver 首先透過 Sender 對外公開的公鑰 (PublicKey) 對簽章進行解密,取得 Sender 簽名之前就計算好的 HashCode (Fingerprint)
- Receiver 使用跟 Sender 相同的 Hash 演算法計算出原始資料 (Data) 的 Hash 值
- Sender 使用的演算法是簽章中的明文資訊,Receiver 可以從中得知
- Receiver 比較前兩步驟中得出的 Hash 值,兩者一樣,則驗證成功,反之則失敗
1 | # Receiver 取得 PublicKey 及 Service.manifest.sha1 簽章檔, |
同樣的用 psudo code 表示這段:
1 | DigitallySingedData = (Signature, Certificate); |
數位簽章滿足密碼學以下的特性:
Integrity (完整性)
:確認檔案沒有在傳輸過程中遭到竄改Authentication (認證)
:Receiver 透過公鑰 (PublicKey) 驗證收到的訊息是否真的是 Sender 本人送過來的。Non-repudiation (不可否定性)
:Sender 無法否定對於其所寄出的訊息的所有權 (Ownership),因為其私鑰已經參與在產生簽章的過程中了,且此私鑰是只有該持有人才知道的。
數位簽章常見的應用:
- TLS/SSL
- JWT
Cryptographic Hash Function
Cryptographic Hash Function 密碼雜湊函式: 又譯為 加密雜湊函式
、密碼雜湊函式
、加密雜湊函式
,是 雜湊函式 的一種。它被認為是一種單向函式,也就是說極其難以由雜湊函式輸出的結果,回推輸入的資料是什麼。這樣的 單向函式
被稱為「現代密碼學的馱馬」。
常見的雜揍演算法:
- MD5
- SHA-1
- RIPEMD-160
- Whirlpool
- SHA-2
- SHA-3
- BLAKE2
- BLAKE3
二、密碼學
- Symmetric-key Algorithm 對稱式演算法
- Asymmetric Cryptography 非對稱式密碼學
Symmetric-key Algorithm (對稱式演算法)
也稱 Symmetric-key Cryptography (對稱金鑰密碼學)
,加密、解密的雙方,使用同一把密鑰對明文或者密文加密、解密。他的優點是快速,缺點就是雙方都會取得同樣的密鑰。
常見的演算法:
- DES (Data Encryption Standard)
- 3DES
- AES
- Blowfish
- IDEA
- RC5
- RC6
Asymmetric Cryptography (非對稱式密碼學)
也稱 Public-Key Cryptography (公開金鑰密碼學),簡稱 公鑰密碼學
,主要是 Asymmetric Algorithm (非對稱金鑰演算法)
,相對於對稱金鑰密碼學,最大的特點在於 Encrypt (加密)
和 Decrypt (解密)
使用不同的金鑰。
- RSA: 1977 年由 Ron Rivest, Adi Shamir, Leonard Adleman 三人共同提出的非對稱加密演算法。
- Diffie-Hellman (迪菲-赫爾曼密鑰交換)
RSA Format
RSA 的格式有很多種,不同平台程式使用的有所不同,以下整理自 cryptosys 的規格:
- Binary DER-encoded format
- PEM or base64 format
1
2
3
4
5-----BEGIN FOO BAR KEY-----
MIIBgjAcBgoqhkiG9w0BDAEDMA4ECKZesfWLQOiDAgID6ASCAWBu7izm8N4V
2puRO/Mdt+Y8ceywxiC0cE57nrbmvaTSvBwTg9b/xyd8YC6QK7lrhC9Njgp/
...
-----END FOO BAR KEY----- - XML format: W3C 和 .NET 的標準格式,以 XML 呈現的資料結構,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<RSAKeyPair>
<Modulus>4IlzOY3Y9fXoh3Y5f06wBbtTg94Pt6vcfcd1KQ0FLm0S36aGJtTSb6pYKfyX7PqCUQ8wgL6xUJ5GRPEsu9
gyz8ZobwfZsGCsvu40CWoT9fcFBZPfXro1Vtlh/xl/yYHm+Gzqh0Bw76xtLHSfLfpVOrmZdwKmSFKMTvNXOFd0V18=
</Modulus>
<Exponent>AQAB</Exponent>
<P>9tbgIiFMXwpw/yf85bNQap3lD7WFlsZA+qgKtJubDFXCAR35N4KKFMjykw6SzaVmIbk80ga/tFUxydytypgt0Q==</P>
<Q>6N6wESUJ0gJRAd6K6JhQ9Xd3YaRFk2sIVZZzXfTIWxKTInOLf9Nwf/Wkqrt0/Twiato4kSqGW2wU6K5MnvqOLw==</Q>
<DP>l0zwh5sXf+4bgxsUtgtqkF+GJ1Hht6B/9eSI41m5+R6b0yl3OCJI1yKxJZi6PVlTt/oeILLIURYjdZNR56vN8Q==</DP>
<DQ>LPAkW/qgzYUi6tBuT/pszSHTyOTxhERIZHPXKY9+RozsFd7kUbOU5yyZLVVleyTqo2IfPmxNZ0ERO+G+6YMCgw==</DQ>
<InverseQ>
WIjZoVA4hGqrA7y730v0nG+4tCol+/bkBS9u4oiJIW9LJZ7Qq1CTyr9AcewhJcV/+wLpIZa4M83ixpXub41fKA==
</InverseQ>
<D>pAPDJ0d2NDRspoa1eUkBSy6K0shissfXSAlqi5H3NvJ11ujNFZBgJzFHNWRNlc1nY860n1asLzduHO4Ovygt9DmQb
zTYbghb1WVq2EHzE9ctOV7+M8v/KeQDCz0Foo+38Y6idjeweVfTLyvehwYifQRmXskbr4saw+yRRKt/IQ==
</D>
</RSAKeyPair>
Diffie–Hellman key exchange
也稱為 DH 演算法,由美國計算機科學家 Hellman、Diffie 和 Merkle 發明,同時也是一種安全協議。
DH 演算法可以讓雙方在完全沒有對方任何預先資訊的條件下,在一個公開、不安全通訊管道中建立起一個金鑰,這個金鑰可以在後續的通訊中,作為對稱金鑰來加密通訊內容。
簡單說:
公開的告訴地告訴對方密碼,卻不用擔心密碼不被竊聽
DH 演算法本身是一個匿名(無認證)的金鑰交換協定,它卻是很多認證協定的基礎。
更多參閱 Widipedia 的介紹。
三、協議系統
整理一些基於密碼學與資訊安全、常見的安全協議系統:
- 應用層
- PGP (Pretty Good Privacy,優良保密協定): 是一套用於訊息加密、驗證的應用程式,採用IDEA的雜湊演算法作為加密和驗證之用。
- DKIM, DomainKeys Identified Mail 域名密鑰識別郵件:
- HTTPS / TLS 安全通訊協議
- mTLS: Multiplexed Transport Layer Security
- SSH
- OAuth
- JWT
- 密鑰管理
- 域名系統
- CAA, DNS Certification Authority Authorization - DNS 憑證頒發機構授權
- DNSSEC
- DNS over HTTPS
- 網路層
- IPSec
- L2TP
- OpenVPN
- PPTP
常見問題
Q: 很多網站都宣稱使用 HTTPS 加密了,為什麼還會出現訂單外洩、帳號密碼被盜的新聞事件?
HTTPS 是 傳輸層加密
,也就是在網路上資料傳輸過的加密。訂單外洩
、帳號密碼被盜
則是另外兩個層次的問題。
用這樣的例子來說明:
你寫一封信,要寄給心儀的對象,但是擔心信件交給郵局、經由郵差送到對方家,信件經由對方家人轉交給心儀的對象,她打開來看確認是你寫的信。
這個過程分以下 階段
:
- 一、你寫一封信,將內容放在信封裡
- 二、到郵局寄出這封信
- 三、信件經郵局分配、轉發給指定郵差
- 四、郵差送到對方家,對方家人收到
- 五、信件經由對方家人,轉交給心儀的對象
- 六、心儀的對象打開信件
所以 傳輸層加密
,指的是 階段二
到 階段四
的過程,也就是內容經過信封包起來之後,轉交出去就算是傳輸加密階段了。這過程稱為 Data Encryption in Transit。這個過程是要避免郵差、郵局的人看到內容,但他們可以知道這封信要去哪裏。HTTPS 像是針對這個信封做了很嚴謹的規範,例如要使用標準信封、要填郵遞區號、字跡要工整 … 諸如此類的。階段三
以郵局的例子來說,實際上還會經過各種分局、貨運、分配中心,所以會經手的人很多。而網路世界的路由,跟真實世界的物流很像,資料會經過各種網路設備,路由器、交換機、Gateway …. 等。
階段六
:收到信件,打開信封讀取內容的過程。大部分的人寫信不會針對信件內容再做什麼手腳,不過有時候擔心信件被對方家人拆開來做,這時候跟心儀對象先約定一個規則,而這個規則只有你和心儀對象知道,例如這樣的規則:
- 所有字母位往左移 3 個位數 (c->z)
- 之後兩兩位置前後對調 (ab -> ba)
- 大小寫互換,空白標點不變。
按照這樣的規則,句子為 How are you.
,就會變成:Le TOX BLV.R
底下是轉譯的過程,步驟是反過來:
- How are you.
- hOW ARE YOU. (大小寫互換)
- Oh WRA EOY.U (位置對調)
- Le TOX BLV.R (字母往左移三個位數)
心儀對象打開信封之後,只要發現內容符合規則,那麼就只有他知道怎麼解讀內容。
這樣經過再一次的轉譯的協議,稱為 Data at Rest
簡單結論:
- 傳輸加密:Data Encryption in Transit,像是 HTTPS
- 資料加密:Data Encryption at Rest,像是 資料存入 S3 使用 SSE or CSE
註:上述移轉字母次序的方式,稱為 凱薩密碼 Caesar Cipher
訂單外洩、帳號密碼
問題中 訂單外洩
、帳號密碼
被盜 的事件是在哪個階段?
這其實是兩個階段的問題,都屬於 Data at Rest
議題。前者是發生在 系統外部
、後者是發生在 系統內部
,用上述的案例說明:
訂單外洩
:是在階段五
之後,也就是心儀對象,拆開信封之後,並沒有將信件內容收好,因此被家人看到了。帳號密碼被盜
: 是發生在階段一
之前,在這之前,你寫的內容本來藏在電腦的某處,但是你老爸早就知道你電腦的密碼。
訂單外洩大多是:
資料落地在非預期的資訊系統,例如客戶的電腦,之後衍生的一連串資安事件
例如客戶從系統下載了訂單資訊,訂單裡就有詳細的使用者個人資訊、詳細的交易資料等,這時候資料已經不在可管理範圍了,如果客戶端的電腦已經中了 APT (Advanced Persistent Threat)
,那麼就很容易發生訂單外洩而不自知。技術方法很多種,但是難的是在於落實與實踐。
新聞事件:
Data at rest, in transit, in use
上述案例,帶出三個資料加密的重要概念,我引用這篇文章的解釋: Encryption in-transit and Encryption at-rest
In Transit (傳輸)
: the data which is being transmitted somewhere to somewhere elseAt Rest (落地)
: the data that is stored somewhere without being used by and/or transmitted to anyoneIn Use (使用)
: the data is not just being stored passively on a hard drive or external storage media, but is being processed by one or more applications
其實就是資料在 傳輸
、落地
、使用
三個階段的概念。
傳輸 (In transit) 大多都是走 SSL/TLS, mTLS 方式,但 落地 (At Rest) 的方式每個實作都不一樣,底下整理一些 Solution 的資訊:
- AWS
- RDS At Rest: Transparent Data Encryption (TDE) for SQL Server (SQL Server Enterprise Edition)
- DynamoDB Encryption at Rest
- S3: 分成 SSE (Server-Side Encryption) 、CSE (Client-Side Encryption),詳細參閱 Protecting data using encryption
- Azure
- PostgreSQL: Transparent Data Encryption, TDE
- MySQL: InnoDB Data-at-Rest Encryption
結論
一直對於資訊安全與密碼學很有興趣,在整理 AWS KMS 學習筆記時,就給自己挖一個坑:
整理密碼學與資訊安全的筆記,把一些以往不清楚的知識整理起來。
很多東西平常工作都會用到,但是卻不求甚解,透過整理文章重新梳理自己有限的知識,如有誤歡迎給予指證,感謝。
下圖是大學時修的資訊安全課本,重新拿出來複習:
延伸閱讀
站內文章
- Study Notes - Key Management Service
- 如何用 G Guite 整合 AWS Single Sign-On
- Study Notes - AWS S3
- 簡介 HTTPS / TLS 安全通訊協議
參考資料
- Security and Cryptography
- X.509
- 为什么 HTTPS 需要 7 次握手以及 9 倍时延 · Why’s THE Design?
- Encryption in-transit and Encryption at-rest – Definitions and Best Practices
- Data at rest
- Azure Data Encryption at rest
資訊安全相關
- Awesome Node.js Security resources
- Awesome Golang Security resources
- Speeding up Linux disk encryption
更新紀錄
- 2020/03/07: 初版
- 2021/03/27:
- 增加 PKCS 格式、RSA 格式說明
- 補充說明: HTTPS 的運作說明
- 增加常見問題: 很多網站都宣稱使用 HTTPS 加密了,為什麼還會出現訂單外洩、帳號密碼被盜的新聞事件?
- 2021/08/20: 將 HTTPS / TLS 通訊協議介紹獨立成專文 簡介 HTTPS / TLS 安全通訊協議