1. 程式人生 > >TLS協議分析 (九) 現代加密通訊協議設計

TLS協議分析 (九) 現代加密通訊協議設計

轉自:http://chuansong.me/n/1286704052752

六.  TLS協議給我們的啟發 — 現代加密通訊協議設計

在看了這麼多的分析和案例之後,我們已經可以歸納出加密通訊協議設計的普遍問題,和常見設計決策,

設計決策點:

  1. 四類基礎演算法 加密/MAC/簽名/金鑰交換 如何選擇?
    對稱加密目前毫無疑問應該直接用aead,最佳選擇就是 aes-128-gcm/aes-256-gcm/chacha20-poly1305了
    數字簽名/驗證方案,如果是移動網際網路,應該考慮直接放棄 RSA,考慮 P-256 的 ECDSA 公鑰證書,或者更進一步的 ed25519 公鑰證書。
    金鑰交換演算法,目前最佳選擇就是 curve25519,或者 P-256。

  2. 對稱加密演算法+認證演算法,如何選擇?或者直接用aead?

  3. 簽名演算法如何選擇?RSA or ECDSA or Ed25519?

  4. 考慮將來的演算法調整,要加版本號機制嗎?
    建議是加上,起碼在金鑰協商的步驟,要加上版本號。便於將來更新演算法。

  5. RSA用作金鑰交換是一個好的選擇嗎?考慮PFS
    建議直接放棄RSA,RSA伺服器端效能比ECDSA更差,簽名更大費流量,而且沒有前向安全性,給私鑰保管帶來更大風險。

  6. 自建PKI,是個好的選擇嗎?crl如何解決?
    自建PKI可以做到更安全,比如簡單的客戶端內建數字簽名公鑰。可是當需要緊急吊銷一個證書的時候,只能通過緊急釋出新版客戶端來解決。

  7. 必須用糟糕的openssl嗎?or something better?crypto++,botan, nacl/libsodium, polarssl?libsodium: ed25519+curve2519+chacha20+poly1305

  8. 重放攻擊如何解決?某種seq?或者nonce如何生成?

  9. 握手過程被中間人篡改的問題怎麼解決?

  10. 效能:私鑰運算的cpu消耗可以承受嗎?加上某種cache?
    要解決私鑰運算的高cpu消耗,必然就需要 session ticket/session id 這種cache機制。顯然session ticket 更好

  11. 延遲:金鑰協商需要幾個rtt?最少多少?加上cache後?和tcp對比如何

  12. TLS的效能(主要指伺服器cpu消耗)還有空間可以壓榨嗎?我能設計一個性能更牛逼的嗎?

七. 附錄:密碼學基礎概念

本文已經很長了,基礎概念的內容更多,再展開介紹就太長了,下面就列一下點,貼一下參考資料,就先這樣,以後再說吧。

當然,最好的資料是下面列的書。

1. 塊加密演算法 block cipher

AES 等

2. 流加密演算法 stream cipher

RC4,ChaCha20 等

3. Hash函式 hash funtion

MD5,sha1,sha256,sha512 , ripemd 160,poly1305 等

4. 訊息驗證碼函式 message authentication code

HMAC-sha256,AEAD 等

5. 金鑰交換 key exchange

DH,ECDH,RSA,PFS方式的(DHE,ECDHE)等

6. 公鑰加密 public-key encryption

RSA,rabin-williams 等

使用什麼padding? OAEP,為什麼不要用PKCS V1.5

7. 數字簽名演算法 signature algorithm

RSA,DSA,ECDSA (secp256r1 , ed25519) 等

8. 密碼衍生函式 key derivation function

TLS-12-PRF(SHA-256) , bcrypto,scrypto,pbkdf2 等

9. 隨機數生成器 random number generators

/dev/urandom 等

八. 參考文獻:

TLS/SSL 相關RFC及標準

協議分析文章

實際部署調優相關

密碼學相關

相關開源專案