## **名词解释** 本文的内容比较新,相关中文资料极少,因此文中的名词对读者可能有点陌生,故byron这里介绍一下文中提到的一些名词: ### 1\. NaCl库: [http://nacl.cr.yp.to/](http://nacl.cr.yp.to/) 是密码学学术权威 Daniel J. Bernstein教授 设计的一个密码学算法库,2008年发开始公布。NaCl的特点是:api简洁而易用,高性能,高安全性,主要用于网络通信,加密,解密,签名等,NaCl提供了构建高层密码学工具的核心功能。 ### 2\. libsodium库: [https://download.libsodium.org/doc/](https://download.libsodium.org/doc/) libsodium是对NaCl库的一个分支,进一步改进接口易用性,和可移植性。 ### 3\. AEAD: [https://www.imperialviolet.org/2014/02/27/tlssymmetriccrypto.html](https://www.imperialviolet.org/2014/02/27/tlssymmetriccrypto.html) AEAD的概念: 在通常的密码学应用中,Confidentiality (保密) 用加密实现,Message authentication (消息认证) 用MAC实现。这两种算法的配合方式,引发了很多安全漏洞,过去曾经有3种方法:1\. Encrypt-and-MAC 2.MAC-then-Encrypt 3.Encrypt-then-MAC ,后来发现,1和2都是有安全问题的,所以,2008年起, 逐渐提出了“用一个算法在内部同时实现cipher+MAC”的idea,称为AEAD(Authenticated encryption with additional data)。 在AEAD这种概念里,cipher+MAC 被 一个AEAD算法替换。 [http://en.wikipedia.org/wiki/Authenticated_encryption](http://en.wikipedia.org/wiki/Authenticated_encryption) ### 4\. ChaCha20-poly1305 ChaCha20-poly1305是一种AEAD,提出者是Daniel J. Bernstein教授,针对移动互联网优化,目前Google对移动客户端的所有流量都使用ChaCha20-Poly1305 ### 5\. AES-GCM AES-GCM是一种AEAD,是目前TLS的主力算法,互联网上https流量的大部分依赖使用AES-GCM。 ### 6\. AES-GCM和ChaCha20-Poly1305的性能对比测试结果: Chip | AES-128-GCM speed | ChaCha20-Poly1305 speed | | --- | --- | :-: | :-: | --- | | | OMAP 4460 | 24.1 MB/s | 75.3 MB/s | | | | Snapdragon S4 Pro | 41.5 MB/s | 130.9 MB/s | | | | Sandy Bridge Xeon (AESNI) | 900 MB/s | 500 MB/s | | ### 7\. AES-CBC 关于AES-CBC,在AES-GCM流行之前,TLS主要依赖AES-CBC,而由于历史原因,TLS在设计之初固定选择了MAC-then-Encrypt结构,AES-CBC和MAC-then-encrypt结合,为选择密文攻击(CCA)创造了便利条件,TLS历史上有多个漏洞都和CBC模式有关: * The POODLE CBC oracle attack:参考: [1.POODLE的一个分析](http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/) [2.openssl的分析](https://www.openssl.org/~bodo/tls-cbc.txt) [3.乌云的文章](http://drops.wooyun.org/papers/3194) * The CRIME compression attack: * The Lucky13 CBC padding oracle timing attack: * The BEAST CBC chained IV attack: ### 8\. SHA2 [http://en.wikipedia.org/wiki/SHA-2](http://en.wikipedia.org/wiki/SHA-2) ### 9\. Curve25519 [http://cr.yp.to/ecdh.html](http://cr.yp.to/ecdh.html) Curve25519 是目前最高水平的 Diffie-Hellman函数,适用于广泛的场景,由Daniel J. Bernstein教授设计。由于NIST P-256的设计过程不透明,有来历不明的参数,被广泛怀疑有后门,所以设计了Curve25519,Curve25519的设计过程完全公开,没有任何来历不明的参数。 部署情况:[http://ianix.com/pub/curve25519-deployment.html](http://ianix.com/pub/curve25519-deployment.html) ### 10\. Ed25519 [http://ed25519.cr.yp.to/](http://ed25519.cr.yp.to/) Ed25519是一个数字签名算法, * 签名和验证的性能都极高, 一个4核2.4GHz 的 Westmere cpu,每秒可以验证 71000 个签名 * 安全性极高,等价于RSA约3000-bit * 签名过程不依赖随机数生成器,不依赖hash函数的防碰撞性,没有时间通道攻击的问题 * 并且签名很小,只有64字节,公钥也很小,只有32字节。 部署情况:[http://ianix.com/pub/ed25519-deployment.html](http://ianix.com/pub/ed25519-deployment.html) ### 11\. 前向安全性 前向安全性( Perfect Forward Secrecy ) [http://vincent.bernat.im/en/blog/2011-ssl-perfect-forward-secrecy.html](http://vincent.bernat.im/en/blog/2011-ssl-perfect-forward-secrecy.html) 前向安全性指的是,如果攻击者抓取并保存流量,那么将来私钥泄露后,攻击者也无法利用泄露的私钥解密这些流量。 ### 12\. Diffie-Hellman 密钥交换 [http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange](http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange) 在任何一本密码学教材里面都会重点介绍的 ### 13\. constant time compare 针对Timing attack,[http://en.wikipedia.org/wiki/Timing_attack](http://en.wikipedia.org/wiki/Timing_attack) (这种攻击真是脑洞大开!) 当一个算法的运行时间和输入数据有关的时候,可以根据运行时间这一信息,破解出密钥等。 典型的,比如要验证一个对称签名,如果你用了C库里面的memcmp(),那你就会被timing attack方式攻击。 因此,涉及到密码学数据的memcmp,必须要用运行时间和输入无关的函数,比如OpenSSL库里面的`CRYPTO_memcmp()`