## 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())的密钥协商模式(肯定有漏洞)