整理加密演算法一些基礎的知識以及應用,主要會介紹下面四種演算法:
- 對稱加密
- 非對稱加密
- 雜湊函式 (Hash function)
- Key derivation functions (KDF)
加密的目的
加密的目的不外乎以下幾種:
- 機密性(confidentiality)——在傳輸數據的時候,不希望竊聽者能夠知道消息的內容。或者保護某些敏感資料如密碼。
- 身份認證(Authentication)——相當於簽名。收信者希望能確證該訊息是特定的某個人發出的,其他人不能冒充,例如數位簽名。
- 完整性(Integrity)——收信者能夠證實自己得到的數據是完整、沒有經第三方改動過的。
- 不可抵賴性(Non-repudiation)——防止發信方抵賴自己創建過、發送過某條消息。
對稱式加密
對稱式加密, Symmetric-key algorithm
原文使用密鑰經過演算法加密成密文,密文通過同一把密鑰可解密成原文。加密解密使用同一把私鑰 (key),因此稱為對稱加密。
A
與B
通信,彼此需要先有同一組密鑰才能互相加解密傳輸內容。
- 優點:運算快
- 缺點:雙方需先取得相同的密鑰
兩種常見對稱加密演算法:
- DES: DES 算是第一個正式出現的對稱加密演算法,不過 DES 的主要問題在於加密密鑰的位數太小,隨著電腦運算力的增加,這一方法已經容易被暴力破解而過時了。
- AES: 高級加密標準(AES)支持三種密鑰大小,128、192和 256 bit。AES算是廣泛使用的對稱加密演算法
對稱金鑰加密牽涉到金鑰交換的問題,它需要通訊雙方在通訊之前先透過一個安全的管道交換共享的金鑰,才可以開始透過對稱加密來傳輸密文;對稱金鑰一旦被竊,其所作的加密即失效;因此在網際網路世界,需要先透過下面的非對稱加密來交換對稱加密的金鑰。
非對稱加密
非對稱加密 (Asymmetric cryptography) 也稱公開金鑰密碼學(Public-key cryptography) 其核心為一組公鑰,一組私鑰,一組加密另一組解密,公鑰可以公開給其他人知道,私鑰自己保存。
加密
加密的話使用公鑰加密,私鑰解密,因此公鑰散佈在網路上並沒有關係。
A
與B
各有一組公私鑰,通信前會先交換彼此的公鑰,A
將要保護的內容用B
的公鑰加密,B
收到後即可用B
自己的私鑰解密得到內容。
簽章
非對稱加密另一個用途為數位簽章,使用私鑰加密,公鑰解密 (注意和上面不同)。
A
將自己的要認證的資訊透過私鑰加密,當其他人透過A
的公鑰來成功解密即可以確保A
的身分
公鑰透過有公信力的數位憑證認證機構,簽授成為電子憑證,可作為數位身分的認證。例如:A
可以在憑證認證機構註冊自己的公鑰和資訊,其他人則可確保在用這組公鑰傳輸時的對象是A
。
不過,公鑰加密在在計算上相當複雜,效能欠佳、遠遠不比對稱加密;因此,在一般實際情況下,往往通過公鑰加密來隨機建立臨時的對稱秘鑰,然後才通過對稱加密來傳輸大量、主體的資料。
RSA
RSA 為一種常見的非對稱加密方法。
參考:
- https://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95
- https://ithelp.ithome.com.tw/articles/10250721
(用公鑰反推私鑰 -> 質因數分解)
對極大整數做因數分解的難度決定了 RSA 演算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA 演算法愈可靠。假如有人找到一種快速因數分解的演算法的話,那麼用 RSA 加密的訊息的可靠性就會極度下降。但找到這樣的演算法的可能性是非常小的。今天只有短的 RSA 鑰匙才可能被強力方式破解。到目前為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。只要其鑰匙的長度足夠長,用RSA加密的訊息實際上是不能被破解的。
到目前為止,世界上還沒有任何可靠的攻擊RSA演算法的方式可以破解 1024bit 的金鑰。 因此現今只金鑰長度超過1024bit,即是安全的,但因為 768 bits 被破解威脅到 1024bit 的金鑰 建議至少使用 2048 bit 的金鑰
Hash function 雜湊函式
雜湊函式,常見的有:
- MD5
- SHA-1
- SHA-256
等等
Hash算法是把任意長度的輸入數據經過算法壓縮,輸出一個尺寸小了很多的固定長度的數據,即hash值。hash值也稱為 Digital Fingerprint 或消息摘要(Message Digest)。
Hash函數具備以下的性質:
- 給定輸入數據,很容易計算出它的hash值 (快);
- 反過來,給定hash值,倒推出輸入數據則很難,計算上不可行。這就是hash函數的單向性,在技術上稱為抗原像攻擊性;
- 想要找出能夠產生同樣的hash值的兩個不同的輸入數據(這種情況稱為碰撞,Collision)很難,計算上不可行,在技術上稱為抗碰撞攻擊性;
- hash值不表達任何關於輸入數據的信息。
應用場景:
- 保護資料 (單向,只能做比對,無法得知原本數據)
- 確保傳遞真實的資訊,未經竄改 (integrity)
- 將內容以及內容的Hash值一並傳輸,對方能自己將內容Hash過後和傳過去的Hash值比對是否相同
- 雜湊表: 使用雜湊表能夠快速的按照關鍵字尋找資料記錄
- 比對資料、檔案:將內容Hash過後,可以透過Hash值快速比對
- 例如語音辨識: 匹配 mp3 檔案
可以使用Hash來儲存密碼進DB嗎?
Hash function 設計將大量內容快速轉成較短的 hash: 適合用來確保完整性 (integrity)
而現今用 hash function 來當作 hash password 的方法已經不太合適,通常會使用下面的 KDF。
Key derivation functions (KDF)
金鑰衍生函式:使用偽隨機函式從諸如主金鑰或密碼的秘密值中衍生出一個或多個金鑰
為了對抗線下的窮舉攻擊,KDFs 通常故意被設計成緩慢執行
KDF 最重要的是有 迭代因子
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
PRF
是一個偽隨機函式,可以簡單的理解為 Hash 函式。Password
為密碼 。Salt
表示鹽值,一個隨機數。c
表示迭代次數。dkLen
表示最後輸出的金鑰長度。
如果 c
的數值越大,那麼運算速度就越慢,增加了時間複雜度,攻擊者破解的成功率就會下降。
可以不斷加大來應對日益強大的電腦運算效能。
運算時間比較:
- Hash function:
Md5
0.1s - KDF:
PBKDF2
16s
常見的 KDF 有
- PBKDF2
- bcrypt
- scrypt
四種加密/函式比較
加密演算法 | 簡述 | 範例應用場景 | 常見演算法 |
---|---|---|---|
對稱加密 | 加解密使用同一組密鑰,運算快、需要雙方先安全的交換金鑰 | 傳輸內容加密 | AES |
非對稱加密 | 加解密使用公私鑰,運算慢、用途多 | 交換對稱加密密鑰 | RSA |
雜湊函式 (Hash) | 將輸入數據經過算法壓縮,輸出一個 Hash 值,不可逆 | 比對資料 | MD5, SHA-256 |
KDF | 類似 Hash 函示,但有迭代的特性可增加時間複雜度提升攻擊難度 | 保存密碼 | bcrypt |
https 中的三種加密演算法應用
- client 發起 http 請求,和伺服器協商支援的TLS版本,和支援的密碼套件(後續需要用到的各種加密演算法)。
- 伺服器將自己的信息以數位證書的形式返回 client (證書內含有公鑰、網站地址、頒發機構、日期等)。
- client 透過數位憑證認證機構 (Certificate Authority,縮寫為CA)驗證證書合法性。
- 瀏覽器產生一個隨機的對稱密鑰 (session key),並用公鑰加密送往伺服器。
- 伺服器使用私鑰解密取得 session key,後續內容便使用對稱加密進行傳送。
https 過程中也有使用 hash 來確保傳遞真實的資訊,沒有被竄改或遺失,例如在傳遞數位證書、和對稱密鑰 (session key)時。
support
支援的 對稱/非對稱 加密方法,會隨著版本而更新
references
- https://www.blocktempo.com/understanding-cryptography-from-math-to-physics/
- https://jackterrylau.pixnet.net/blog/post/222379223-2017-05-05-https-%E4%BA%A4%E6%8F%9B%E8%A8%8A%E6%81%AF%E5%8E%9F%E7%90%86
- https://read01.com/zh-tw/7Pj4g8.html#.YVVjbTHP1PY
- https://missing-semester-zh-hant.github.io/2020/security/