https优化必须了解ChaCha20-Poly1305算法

前几天看到某个公众号发的一遍关于HTTPS优化的文章,进去一看,全是错误的观点,给自己的感觉非常不好。

  • 这篇文章下的留言完全文不答题,可见大家都是走马观花,看的文章越多,就很难去辨别真假和实践了。
  • HTTPS优化其实没有太多的技巧,大家在网络上看到一篇优化文章,一定要留意发表时间,随着时间的推移,这些技巧可能已经过时,一定要看官方的介绍(比如 OpenSSL)。

基于这两个问题,我谈一谈那篇文章提到的二个概念(分别是ChaCha20-Poly1305算法和等价加密算法组),分两篇文章讲解,希望给你更多的思考。本文主要讲解ChaCha20-Poly1305算法的方方面面。

AEAD

一图胜千言:


12-4-chacha20-grid.png

在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 推荐的配置:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;

我会长期关注HTTPS方面的进展,所有写的文章都不是从《深入浅出HTTPS:从原理到实战》搬移的,都是我最新学习的,欢迎大家关注,我的公众号(ID:yudadanwx,虞大胆的叽叽喳喳),本文发表于【2018-12-04】

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 原文 https://blog.wilddog.com/?p=749 主题 Https OpenSSL 性能优化 ...
    咖啡绿茶1991阅读 1,098评论 0赞 0
  • 最近看了一部电视剧《夏日里的春天》,当时搜到这部电视剧的时候,说是中国内地第一部偶像剧,然后我就没事的时候拿出来看...
    邹邹0414阅读 444评论 0赞 0
  • 今逢周末,我和母亲陪女儿去买衣服。 “给你后面这个男孩儿买吗?”售货员是个身材略胖的年轻男子,声音很温柔,面带微笑...
    薇薇_24ee阅读 318评论 2赞 2
  • “台上一分钟,台下十年功”这句话,对长期健身的人来说,大概就是一伸出手,就能看见一层老茧。 大多数的器械训练都涉及...
    仙贝君阅读 2,743评论 2赞 3
  • 英语、看书、音乐、电影、健身 1、发布内容:书、音乐、自拍(3张内)、前期不发布健身照、电影、英语 2、聊天套路:...
    丹宁蓝阅读 1,083评论 0赞 0

友情链接更多精彩内容