## 9.?**Diffie-Hellman 密鑰交換**
應該使用NaCl,Curve25519,或者DH-2048
適用場景:*如果你在設計加密消息傳輸系統,并且無法使用固定對稱密碼*
這是很棘手的一條,主要考量如下:
* 如果你能使用NaCl庫,那就使用NaCl庫。你甚至不需要管NaCl是什么。
* 如果你能使用一個可信賴的第三方庫,那就使用Curve25519,這是一條現代的ECDH曲線,有豐富的開源代碼,性能經過高度優化,被徹底地安全分析過。并且Curve25519即將進入TLS 1.3版本標準。
* 但是絕對不要自己實現Curve25519,也絕對不要自己移植Curve25519的C代碼
* 如果你不能使用第三方ECDH庫,但是可以使用DH庫,那就使用DH-2048,使用1個標準的2048 bit的群。
* 但是不要使用傳統的DH,如果你需要協商DH參數,或者和其他實現互操作
* 如果你一定要做握手協商,或者和舊軟件互操作,那么考慮使用NIST P-256, NIST P-256 有廣泛的軟件支持。
* 寫死在代碼里的DH-2048參數,比NIST P-256更安全。NIST P-256比協商出來的DH更安全。
* 但是,由于NIST P-256的實現有一些陷阱,所以一定要謹慎選擇可信賴的,廣泛使用使的第三方庫
* P-256 可能是NIST曲線中最安全的,不要使用P-224。
DH(密鑰協商)算法確實很難用,但是它很重要。
* 避免,傳統常規的 DH, SRP, J-PAKE 握手和協商
* 避開任何只使用了塊加密算法和srand(time())的密鑰協商模式(肯定有漏洞)