摘要密碼學與資訊安全


整理一些 密碼學 (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 檔案出現。
  • 把憑證跟私鑰一起儲存,則使用 PKCS#12 (.p12) 格式
  • 憑證種類:自簽憑證、根憑證、中介憑證、授權憑證、終端實體憑證 (TLS 伺服器憑證、萬用字元憑證、TLS 客戶端憑證)
  • X.509:一種廣泛使用的憑證標準格式,v3 的標準是 RFC 5280
    • CSR: Certificate Signing Request 憑證簽章請求

Process of Digital Certificate

下圖是數位簽章的工作流程,分成兩個部分:

上圖左邊 Sender 的部分,也就是想要傳送資料的人,步驟如下:

  1. Sender 使用雜湊演算法 (Hashing algorithms),計算待傳送資料 (Data) 的雜湊值 (Hash)
    • 常見的 雜湊演算法:MD5、SHA-family
    • 可以透過 openssl dgst -h 找到相關的演算法。
    • 這個雜湊值也稱為 指紋 (Fingerprint)
  2. Sender 用自己的 私鑰 (PrivateKey) 對步驟 1) 的 Fingerprint 進行加密,產生 簽章 (Signature)
    • 這個動作叫做 簽名 (Signing),用來代表證明是 Sender 送過去的 認證
  3. Sender 將 (簽章和原始資料) 寄給 Receiver.
    • Sender 應該要透過其他方式,對其他人 (包含 Receiver) 公開公鑰 (PublicKey)
    • Data + Signature 稱為 數位簽章資料(Digitally signed data)

這個過程用 openssl 範例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 原始資料 (Data)
cat Service.manifest

service-id: gt.shorturl
service-owner: rickhwang@abc.com
service-init: 2020/01/22

# 取得資料的指紋 (Fingerprint),範例使用雜揍演算法為 SHA1
## 註:MD5 / SHA1 已經都被證實會產生碰撞造成不安全
❯ openssl dgst -sha1 Service.manifest
SHA1(Service.manifest)= b3903ad5463fb72f5bad31088c43aae76fe4ce4c


# 透過 OpenSSL,使用 Private Key 與 sha1 簽一份檔案,產生簽章
## 一次完成步驟 1), 2)
openssl dgst -sha1 \
-sign serviceA-rsa-4096bit.private.pem \
-out Service.manifest.sha1 \
Service.manifest

cat Service.manifest.sha1
S~�h�s
W�۳|2{
���~m�c�B�3�fc��n�B�s�ܭX���]v=1[�E=�{��ӭ�Cdg%���2 0���R
Sb��O�p�w�
qB|a�Ĺ�Ƌ��!�>{�^,��8�oDc

## 轉 Base64
cat Service.manifest.sha1 | openssl enc -base64 \
-out Service.manifest.sha1.enc

cat Service.manifest.sha1.enc
R15c71gPo/y8fhuJNFMrMHEMuOZ4SVYHlYvm2TWCJgoHoOsK+5+EsnmNbKk1eNFY
xZsREPZbR549dMtPStJ+2/1OoTfrIWfrNM0lmEFCNqC1a8XiuM3BerUx1HAbwC0u
...
/OKSfK1/l2DMLXl1hafMzB3pHQiymkBLa0ZescTVD1t7BSfau08bu/aBvRHxbefS
Xn46kKqkIhdlnOObWMQEjC1cuSXMg3N4chmuLAD4R1c=

寫成 psudo code 大概長這樣:

1
2
3
Fingerprint = Hash(Data, HashFunction);
Signature = Signing(Fingerprint, PrivateKey);
send (Signature, Certificate);

上圖右邊 Receiver 的部分,接收到資料後,確認是 Sender 寄來的過程:

  1. Receiver 會收到 Sender 寄來的 Data + Signature 兩個東西。
  2. Receiver 首先透過 Sender 對外公開的公鑰 (PublicKey) 對簽章進行解密,取得 Sender 簽名之前就計算好的 HashCode (Fingerprint)
  3. Receiver 使用跟 Sender 相同的 Hash 演算法計算出原始資料 (Data) 的 Hash 值
    • Sender 使用的演算法是簽章中的明文資訊,Receiver 可以從中得知
  4. Receiver 比較前兩步驟中得出的 Hash 值,兩者一樣,則驗證成功,反之則失敗
1
2
3
4
5
6
7
# Receiver 取得 PublicKey 及 Service.manifest.sha1 簽章檔,
# 驗證檔案確實是由 Sender 所簽發出的
openssl dgst -sha1 \
-verify serviceA-rsa-4096bit.public.pem \
-signature Service.manifest.sha1 \
Service.manifest
Verified OK

同樣的用 psudo code 表示這段:

1
2
3
4
5
6
7
8
9
DigitallySingedData = (Signature, Certificate);

PublicKey = Certificate?.GetPublicKey();
HashFunctionName = Certificate?.GetHashFunction();

DataHash = Hash(Data, HashFunctionName)
SignatureHash = Decrypt(Signature, PublicKey)

return (DataHash == SignatureHash);

數位簽章滿足密碼學以下的特性:

  • 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

二、密碼學

  1. Symmetric-key Algorithm 對稱式演算法
  2. 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 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 的介紹。


三、協議系統

整理一些基於密碼學與資訊安全、常見的安全協議系統:

  • 應用層
  • 密鑰管理
    • Kerberos: Kerberos是一種計算機網絡認證協議,它允許某實體在非安全網絡環境下通信,向另一個實體以一種安全的方式證明自己的身份。
    • X.509: 簡稱 PKIX,公鑰憑證的格式標準。應用在包括 TLS/SSL 的眾多網路協定。
  • 域名系統
  • 網路層
    • IPSec
    • L2TP
    • OpenVPN
    • PPTP

常見問題

Q: 很多網站都宣稱使用 HTTPS 加密了,為什麼還會出現訂單外洩、帳號密碼被盜的新聞事件?

HTTPS 是 傳輸層加密,也就是在網路上資料傳輸過的加密。訂單外洩帳號密碼被盜 則是另外兩個層次的問題。

用這樣的例子來說明:

你寫一封信,要寄給心儀的對象,但是擔心信件交給郵局、經由郵差送到對方家,信件經由對方家人轉交給心儀的對象,她打開來看確認是你寫的信。

這個過程分以下 階段

  • 一、你寫一封信,將內容放在信封裡
  • 二、到郵局寄出這封信
  • 三、信件經郵局分配、轉發給指定郵差
  • 四、郵差送到對方家,對方家人收到
  • 五、信件經由對方家人,轉交給心儀的對象
  • 六、心儀的對象打開信件

所以 傳輸層加密,指的是 階段二階段四 的過程,也就是內容經過信封包起來之後,轉交出去就算是傳輸加密階段了。這過程稱為 Data Encryption in Transit。這個過程是要避免郵差、郵局的人看到內容,但他們可以知道這封信要去哪裏。HTTPS 像是針對這個信封做了很嚴謹的規範,例如要使用標準信封、要填郵遞區號、字跡要工整 … 諸如此類的。階段三 以郵局的例子來說,實際上還會經過各種分局、貨運、分配中心,所以會經手的人很多。而網路世界的路由,跟真實世界的物流很像,資料會經過各種網路設備,路由器、交換機、Gateway …. 等。

階段六:收到信件,打開信封讀取內容的過程。大部分的人寫信不會針對信件內容再做什麼手腳,不過有時候擔心信件被對方家人拆開來做,這時候跟心儀對象先約定一個規則,而這個規則只有你和心儀對象知道,例如這樣的規則:

  1. 所有字母位往左移 3 個位數 (c->z)
  2. 之後兩兩位置前後對調 (ab -> ba)
  3. 大小寫互換,空白標點不變。

按照這樣的規則,句子為 How are you.,就會變成:Le TOX BLV.R

底下是轉譯的過程,步驟是反過來:

  1. How are you.
  2. hOW ARE YOU. (大小寫互換)
  3. Oh WRA EOY.U (位置對調)
  4. 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 議題。前者是發生在 系統外部、後者是發生在 系統內部,用上述的案例說明:

  1. 訂單外洩:是在 階段五 之後,也就是心儀對象,拆開信封之後,並沒有將信件內容收好,因此被家人看到了。
  2. 帳號密碼被盜: 是發生在 階段一 之前,在這之前,你寫的內容本來藏在電腦的某處,但是你老爸早就知道你電腦的密碼。

訂單外洩大多是:

資料落地在非預期的資訊系統,例如客戶的電腦,之後衍生的一連串資安事件

例如客戶從系統下載了訂單資訊,訂單裡就有詳細的使用者個人資訊、詳細的交易資料等,這時候資料已經不在可管理範圍了,如果客戶端的電腦已經中了 APT (Advanced Persistent Threat),那麼就很容易發生訂單外洩而不自知。技術方法很多種,但是難的是在於落實與實踐。

新聞事件:

Data at rest, in transit, in use

上述案例,帶出三個資料加密的重要概念,我引用這篇文章的解釋: Encryption in-transit and Encryption at-rest

  1. In Transit (傳輸): the data which is being transmitted somewhere to somewhere else
  2. At Rest (落地): the data that is stored somewhere without being used by and/or transmitted to anyone
  3. In 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 KMS 學習筆記時,就給自己挖一個坑:

整理密碼學與資訊安全的筆記,把一些以往不清楚的知識整理起來。

很多東西平常工作都會用到,但是卻不求甚解,透過整理文章重新梳理自己有限的知識,如有誤歡迎給予指證,感謝。

下圖是大學時修的資訊安全課本,重新拿出來複習:


延伸閱讀

站內文章

參考資料

資訊安全相關


更新紀錄

  • 2020/03/07: 初版
  • 2021/03/27:
    1. 增加 PKCS 格式、RSA 格式說明
    2. 補充說明: HTTPS 的運作說明
    3. 增加常見問題: 很多網站都宣稱使用 HTTPS 加密了,為什麼還會出現訂單外洩、帳號密碼被盜的新聞事件?
  • 2021/08/20: 將 HTTPS / TLS 通訊協議介紹獨立成專文 簡介 HTTPS / TLS 安全通訊協議


Comments

2020/03/07 21:42:30





  • 全站索引
  • 學習法則
  • 思考本質
  • 一些領悟
  • 分類哲學
  • ▲ TOP ▲