https优化必须了解ChaCha20-Poly1305算法
前几天看到某个公众号发的一遍关于HTTPS优化的文章,进去一看,全是错误的观点,给自己的感觉非常不好。
这篇文章下的留言完全文不答题,可见大家都是走马观花,看的文章越多,就很难去辨别真假和实践了。
HTTPS优化其实没有太多的技巧,大家在网络上看到一篇优化文章,一定要留意发表时间,随着时间的推移,这些技巧可能已经过时,一定要看官方的介绍(比如 OpenSSL)。
基于这两个问题,我谈一谈那篇文章提到的二个概念(分别是ChaCha20-Poly1305算法和等价加密算法组),分两篇文章讲解,希望给你更多的思考。本文主要讲解ChaCha20-Poly1305算法的方方面面。
AEAD
一图胜千言:
在HTTPS协议(TLS协议中)中,密码库(OpenSSL、NSS)在进行数据加密的时候,涉及到两种算法,分别是对称加密算法和MAC算法,为保证机密性和完整性,这两种算法必须同时存在。
对于密码库(比如OpenSSL)来说,如果由它结合处理对称加密算法和MAC算法,有的时候会出现安全问题,CBC 迭代会遇到填充攻击,也就是说传统加密模式存在安全风险。
这时候就出现了 AEAD 加密模式,它在内部自行处理加密和MAC运算,无须密码库(比如OpenSSL)处理,安全性更高,而ChaCha20-Poly1305也采用AEAD加密模式。
单独从加密算法的角度来看,分为块加密算法和流密码加密算法,RC4是一种流密码加密算法,但由于安全问题,已经基本不在HTTPS中使用了,块加密算法比较流行的就是 AES 算法,而ChaCha20-Poly1305是一种流加密算法。
现在我们从整体上了解了ChaCha20-Poly1305算法的定位,如果你想了解更多 AEAD 的知识,可以参考我写的书《深入浅出HTTPS:从原理到实战》。那么和AES-GCM相比,它有哪些优点呢?它为什么出现呢?
性能
对于 AES 这样的块加密算法来说,在某些硬件上运行的非常快,比如现在的服务器和台式机都有AES-NI加速指令。而如果没有加速指令,纯粹通过软件运行,性能是很低的。
而流密码算法刚好反过来,软件实现性能更高,大部分移动设备(比如手机)由于没有AES-NI支持,运行 AES 加密是很缓慢的。运行 RC4 这样的流加密算法速度相对较快,可惜的是 RC4 早已经被证明不安全了。
这个时候ChaCha20-Poly1305流密码算法来了,除了安全性外,它在移动设备上运行的性能较高。大部分观点认为,在移动设备上(没有AES-NI指令),ChaCha20-Poly1305 算法的性能是 AES-128-GCM 的三倍;当然在台式机和服务器上,AES-128-GCM 性能比ChaCha20-Poly1305更高。
Adam Langley 在2014年做过一个性能测试,见下面的表格:
Chip | AES-128-GCM 速度 | ChaCha20-Poly1305速度 |
---|---|---|
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 |
历史
ChaCha20-Poly1305 算法是Google 2013年提出来的,11月份在Chrome 31版本启用了该算法,2014年4月所有的IOS设备和Android设备上的Chrome也启用了。firfox的密码库用的是 NSS,NSS 3.23 版本支持 ChaCha20/Poly1305。
CloudFlare在2015年2月也支持了ChaCha20/Poly1305算法,经检测有10%的流量使用了这种算法。
不过不管是Google还是CloudFlare,他们实现的ChaCha20/Poly1305算法都不是最终的版本,从2015年开始,IETF 对这一算法进行了标准化,历经了多个草案(https://tools.ietf.org/html/draft-mavrogiannopoulos-chacha-tls-05),最终在2016年6月定稿了(https://tools.ietf.org/html/rfc7905)。
作为世界上最流行的密码库和TLS库,OpenSSL从 1.1.0(2016年8月)开始支持 ChaCha20-Poly1305 算法。如果你使用的是 OpenSSL 版本较旧,可以使用 CloudFlare 开发的 patch(https://github.com/cloudflare/sslconfig/blob/master/patches/openssl__1.1.0_chacha20_poly1305.patch)
Nginx 支持
Nginx使用的密码库是 OpenSSL,只要 OpenSSL 版本支持该算法,那么 Nginx 就能使用,配置非常简单,比如 mozilla 推荐的配置:
我会长期关注HTTPS方面的进展,所有写的文章都不是从《深入浅出HTTPS:从原理到实战》搬移的,都是我最新学习的,欢迎大家关注,我的公众号(ID:yudadanwx,虞大胆的叽叽喳喳)
本文转载自异步社区。
原文链接:https://www.epubit.com/articleDetails?id=N914078cc-b5fd-4f42-8167-8764af85685b
- 点赞
- 收藏
- 关注作者
评论(0)