可以侵入https://m.www9955g0mbh.com 这个网吗

研究人员发明了一种新办法可鉯在使用加密体系保护的网站、VPN和互联网服务器中放入不被检测的后门,这一壮举使得黑客可以轻松解密数以亿计的加密通信和密钥

这┅技术最引人注目的地方就是它将一个后门程序(也可以说是“陷阱”)放在了Diffie-hellman密钥交换所使用的1024位密钥中。Diffie-hellman的存在大大增加了窃听者的负担因为它会定期更改加密密钥来保护正在进行的通信。按照以往经验来说只要攻击者知道了“陷阱门”的存在,那么破解受Diffie-hellman保护的通信僦只是时间问题了知识完备的攻击者也可以基于广泛使用的数字签名算法创建自己的加密签名。

随着所有公共密钥的加密Diffie-hellman的安全协议昰建立在数据理论计算之上的,其中包含的数量巨大攻击者想要解决它难于登天。各方都能够保守计算结果中所包含的秘密然而研究囚员设计的一个特殊质数包含了能够使得秘密参数难以被发现的无形属性。研究人员使用一个2,000 到 3,000 CPU 的学术计算群集可以在两个月左右的时间裏攻破这些1024位质数中的一个

后门加密标准——“完全可行”

对于密钥拥有者来说,带有“陷阱门”的密钥和其他任何1024位密钥没有任何区別但是对于了解密钥漏洞的攻击者来说,巩固安全性能的离散对数问题根本就是小意思这种效率使得“陷阱门”对于国家安全局承包商Edward Snowden 来说十分理想,他在2013年说过他的目的就是要解码大量的加密网络

参与此项目的宾夕法尼亚大学研究人员Nadia Heninger告诉Ars,“Snowden文件已经引起了关于公钥加密标准中后门程序的一些严重问题我们展示的那个“陷阱门”可以让攻击者们快速打破1024位秘密钥。”

国家标准与技术研究所(NIST)从2010年僦开始建议使用2048位作为密钥的最小尺寸但是1024位密钥仍旧大量出现在网络当中。上个月SSL Pulse开展的一项调查表明保护的前两千家网站当中有22%使用1024位密钥执行密钥交换。这种广泛使用的背后是大家普遍相信只有国家资助的窃听组织才会花费巨大代价来破解1024位密钥其他原因还包括2048位密钥存在执行和兼容方面的困难。比如说2014年发布的JAVA 8就不支持Diffie-hellman 或 DSA 密钥大于 1024 位。并且直到目前为止DNSSEC规范为了确保互联网的域名系统安铨,限制数字签名算法密钥最高为1024位

在Diffie-Hellman中,解决关键的离散对数问题非常重要原因就是大量的应用程序都要频繁标准化和使用一组质數。

如果美国国家安全局或其他组织成功将一个或多个“陷阱门”变成主流做法该机构就能够成功窃听到数以百万计,甚至数不尽的终端用户的加密通信到目前为止,研究者们还没有在广泛使用的应用程序中发现“陷阱门”的存在但是这并不意味着它们不存在。

2008年互联网工程任务组发表了一系列可用于高度敏感应用中的推荐质数,其中包括包括保护网站和电子邮件服务器的安全协议传承层、用于远程管理服务器的安全外壳协议、保护链接的互联网密钥交换以及电子邮件的安全/多用途互联网邮件扩展标准。这些质数当中已经带有了研究者们创建的陷阱程序外人几乎没有办法知道真相,解决这一数学问题需要处理器运转几个世纪

同样的,Heninger说世人无法知道Apache Web 服务器所使用的关键 1024 位质数是否也被安装了后门程序。她在邮件中写到:

“我们自己永远也没有办法检测出安装了陷阱程序的质数但是我们知噵“陷阱门”的工作原理,并且能够量化攻击者所获得的收益所以人们开始提出一些尖锐问题,在某些不透明的执行和标准中质数到底是如何生成的?为什么在没有证据的情况下要求我们信任RFC 5114 的质数?为什么在没有证据证明它们是随机生成的情况下,VPN就标准化并广泛执行这些质数?”

不同于RSA密钥中的质数特定的Diffie-Hellman 质数非常常见。如果NSA或其他组织成功将一个“陷阱门”广泛应用将会引发一场暴乱。从那时起敵对势力将会在Diffie-Hellman的加密通信中窃取彼此机密。

假设这样的场景已经发生这也不是NSA第一次故意削弱标准,以方便自己破解加密了例如,2007姩NIST支持NSA开发代码生成随机数生成器几乎从一开始,所谓的 Dual_EC_DRBG就被怀疑含有一个精心设计的弱点允许机构能够迅速破解以来关键随机性算法的加密密钥。六年后也就是2013年,Snowden泄露文件证实了这一怀疑

RSA安全公司,当时属公开上市交易的EMC所有回应中警告用户停止使用Dual_EC_DRBG。当时Dual_EC_DRBG是RSA的BSAFE中的默认随机数生成器,以及数据保护管理器程序

今年年初,研究人员确定该生成器就是两个后门程序之一允许攻击者可以解密VPN通信,在那之后Juniper网络也删除了自己防火墙NetScreen中由NSA开发的数字生成器。

相比于1024位密钥破解一个带有“陷阱门”程序的2048位密钥所需时间增加了16万倍。尽管对于宾夕法尼亚大学、法国国家研究所和洛林大学的计算机科学和控制专家来说这一时间还是很不保险他们还是建议应該尽快淘汰1024位密钥。

他们在上周发表的一篇论文中写道“对后门程序的离散对数计算只对1024位密钥可行,抵制后门程序攻击最有效的办法僦是使用任何计算都不可行的密钥NIST在2010年就推荐将1024位密钥从DSA、RSA和 Diffie-Hellman 中移除。但不幸的是这种密钥至今仍在广泛使用。”

研究者说除了使鼡2048位或更大的密钥,还必须使用可以验证的基本质数随机生成的方式来说生成密钥其中一种做法中大多数字节都来自密码学家成为“不茬我的袖子里”。另一种方法是标准化质数包括用于确保随机性的种子质数。可惜的是由于1024位密钥的广泛使用,这种做法渐渐消失了虽然联邦信息处理标准强加给美国政府机构和其承包商一个生成质数的种子,但是这个选项不是必选

研究人员已经发现的唯一广泛使鼡的质数就是使用Oakley 密钥确定协议生成的,该协议是为TLS1.3版本和JAVA开发工具包准备的有限领域 Diffie-hellman 短暂参数

破解加密密钥最近常使用的方法被称为數域筛算法,根据密钥类型(离散对数或是因子分解)解决问题到目前为止,已知的离散对数的最大质数问题是去年解决的长度达到768位。楿比之下解决含有陷阱程序的1024位密钥问题只需要其十分之一的计算量。

从上世纪90年代早期开始研究人员就已经知道某些复合整数会被NFS優先考虑。他们还知道带有某些属性的质数更便于离散对数的计算这组特殊的质数会比普通质数更容易被NFS破解。在这25年左右的时间里研究人员相信“陷阱门”的质数不是威胁,因为它们很容易解决但现在新的研究通过特殊的数域筛法发现,长久以来的这种观点是错误嘚

“能够使用更快形式算法的条件是该质数必须要有一种特定的属性。对于常见的一些质数比如一个质数非常接近2的幂,我们使用这種质数来执行一些操作是很容易出问题的

但是也存在一些无法检测的质数(或者更准确地说,是需要大量的计算才能检测出)这是更麻烦嘚事实,因为用户无法知道给定的质数是否有某种特定属性毕竟它们看起来都一样。我们在本文中讨论了应该如何构建着中具有特殊属性的质数但是不知道这个秘密的人是无法检测出该属性的。

保证一个质数不存在这种“陷阱门”是可能的一种方法就是通过“不在我袖子里”来生成质数。有一些标准采用这种方法另一种方法就是为随机生成算法指定种子。”

随着1024位质数渐渐退出历史舞台2048甚至4096位质數会逐渐变成主流。那些无法确认安全的1024位密钥应该被视为可疑密钥并尽快清除。

据外媒HackerNews报道得益于前NSA员工斯诺登泄露的分类文档,茬2014年外媒已经了解到NSA通过利用Diffie-Hellman密钥交换算法来破解数万亿加密连接的能力

据最新报道美国国家安全局(NSA)承包商雇员Thomas martin因窃取国家机密而遭到逮捕。如果最终马丁被定罪他将面临最高10年的监禁。

路透社10月5日报道称去年雅虎为美国政府定制了一款秘密工具,可以对上百万雅虎郵箱进行实时扫描这样一来NSA或FBI就可以实时扫描每一个用户的邮件,搜索他们感兴趣的内容而Motherboard最新的报道则指出,这还不仅仅只是个扫描工具

今年8月,一组叫做影子经纪人(The Shadow Brokers)的黑客救入侵了NSA的御用黑客方程组组织并泄露了大约300兆的私密信息和黑客工具。

现在研究人员開发出了恶意软件CottonMouth的升级版USBee,不需要改装USB就可以传输数据就可以用于从任何未联网的计算机中偷取数据研究员们把这种软件命名为USBee(USB蜜蜂)。

HTTPS协议原理分析

HTTPS协议需要解决的问題

HTTPS作为安全协议而诞生那么就不得不面对以下两大安全问题:

  • 确保通信双方身份的真实性。直白一些A希望与B通信,A如何确认B的身份不昰由C伪造的

    (由C伪造B的身份与A通信,称为中间人攻击)

  • 通信的机密性、完整性依赖于算法与密钥通信双方是如何选择算法与密钥的。

能同时解决以上两个问题就能确保真实有效的通信双方采取有效的算法与密钥进行通信,便完成了协议安全的初衷

在介绍HTTPS协议如何解決两大安全问题前,我们首先了解几个概念

  • 数字证书是互联网通信中标识双方身份信息的数字文件,由CA签发

  • CA(certification authority)是数字证书的签发机構。作为权威机构其审核申请者身份后签发数字证书,这样我们只需要校验数字证书即可确定对方的真实身份

  • HTTPS协议、SSL协议、TLS协议、握掱协议的关系

    SSL协议是一种记录协议,扩展性良好可以很方便的添加子协议,而握手协议便是SSL协议的一个子协议

    TLS协议是SSL协议的后续版本,本文中涉及的SSL协议默认是TLS协议1.2版本

HTTPS协议的安全性由SSL协议实现,当前使用的TLS协议1.2版本包含了四个核心子协议:握手协议、密钥配置切换協议、应用数据协议及报警协议

解决身份验证与通信加密的核心,便是握手协议接下来着重介绍握手协议。

握手协议的作用便是通信雙方进行身份确认、协商安全连接各参数(加密算法、密钥等)确保双方身份真实并且协商的算法与密钥能够保证通信安全。

对握手协議的介绍限于客户端对服务端的身份验证单向身份验证也是目前互联网公司最常见的认证方式。

首先我们看一下协议交互如图1所示:

接下来以Wireshark的握手协议过程为例,针对每条协议消息分析

ClientHello消息的作用是,将客户端可用于建立加密通道的参数集合一次性发送给服务端。

消息内容包括:期望协议版本(TLS 1.2)、可供采用的密码套件(Cipher Suites)、客户端随机数(Random)及扩展字段内容(Extension)等信息如图2所示。

ServerHello消息的作用是在ClientHello参数集合中選择适合的参数,并将服务端用于建立加密通道的参数发送给客户端

消息内容包括:采取的协议版本(TLS 1.2)、采用的密码套件(Cipher Suite)、服务端随机数(Random)、用于恢复会话的会话ID(Session ID)及扩展字段等信息,如图3所示

自此客户端与服务端的协议版本、密码套件已经协商完毕。

这里服务端下发的会话ID鈳用于后续恢复会话若客户端在ClientHello中携带了会话ID,并且服务端认可则双方直接通过原主密钥生成一套新的密钥即可继续通信。将两个网絡往返降低为一个网络往返提高通道建立的效率。

Certificate消息的作用是将服务端证书的详细信息发送给客户端,供客户端进行服务端身份校驗

消息内容:服务端下发的证书链,如图4所示

服务端为了保证下发的证书能够被客户端正确识别,就需要将签发此证书的CA证书一同下發构成证书链,保证客户端可以根据证书链的信息在系统配置中找到根证书并通过根证书的公钥逐层向下验证证书的合法性。 
如图所礻五八服务器下发了两个证书:自己的证书与签发CA的证书。通过签发CA的证书信息能够直接找到根证书。

客户端本地校验服务端证书若校验通过,则客户端对服务端的身份验证便完成了

Certificate这个阶段解决了两端的身份验证问题。借助CA的力量通过CA签发证书,将身份验证的笁作交给了CA处理 
只要是我们认可的CA,签发的证书我们均认可证书持有者的身份由于CA的介入,解决了中间人攻击的问题因为中间人并沒有服务端的证书可供客户端验证。

ServerKeyExchange消息的作用是将需要服务端提供的密钥交换的额外参数,传给客户端有的算法不需要额外参数,則ServerKeyExchange消息可不发送

消息内容:用于密钥交换的额外参数,如图5所示

如图5,服务端下发了“EC Diffile-Hellman”密钥交换算法所需要的参数

ServerHelloDone消息的作用是,通知客户端ServerHello阶段的数据均已发送完毕等待客户端下一步消息。

ClientKeyExchange消息的作用是将客户端需要为密钥交换提供的数据发送给服务端。

当峩们选用RSA密钥交换算法时此消息的内容便是通过证书公钥加密的用于生成主密钥的预主密钥。

当发送了ClientKeyExchange后两端均具有了生成主密钥的唍整密钥数据与随机数,两端分别根据所选算法计算主密钥即可

至此,ClientKeyExchange发送后两端均可生成主密钥,密钥交换问题便解决了

有的读鍺可能对随机数的采用有些疑惑,笔者觉得随机数的加入是为了提高密钥的随机性 
由于客户端直接生成的密钥很有可能不够随机,而通過预主密钥加上两端提供的两个随机数做种子创建的主密钥可以保证更加贴近真实随机的密钥。

经过以上六条消息我们已经解决了身份认证问题、密码套件选取问题、密钥交换问题。双方也已经通过主密钥生成了实际使用的六个加解密密钥

ChangeCipherSpec消息的作用,便是声明后续消息均采用密钥加密在此消息后,我们在WireShark上便看不到明文信息了

Finished消息的作用,是对握手阶段所有消息计算摘要并发送给对方校验,避免通信过程中被中间人所篡改

自此,HTTPS如何保证通信安全通过握手协议的介绍,我们已经有所了解

但是,在全面使用HTTPS前我们还需偠考虑一个众所周知的问题——HTTPS性能。

相对HTTP协议来说HTTPS协议建立数据通道的更加耗时,若直接部署到App中势必降低数据传递的效率,间接影响用户体验

接下来,介绍HTTPS性能救星——HTTP2协议

随着互联网的快速发展,HTTP1.x协议得到了迅猛发展但当App一个页面包含了数十个请求时,HTTP1.x协議的局限性便暴露了出来:

  • 每个请求与响应需要单独建立链路进行请求(Connection字段能够解决部分问题)浪费资源。
  • 每个请求与响应都需要添加完整的头信息应用数据传输效率较低。
  • 默认没有进行加密数据在传输过程中容易被监听与篡改。

HTTP2正是为了解决HTTP1.x暴露出来的问题而诞生的

由于HTTP1.x暴露出来的问题,Google设计了全新的名为spdy的新协议spdy在五层协议栈的TCP层与HTTP层引入了一个新的逻辑层以提高效率。spdy是一个中间层对TCP层与HTTP層有很好的兼容,不需要修改HTTP层即可改善应用数据传输速度 
spdy通过多路复用技术,使客户端与服务器只需要保持一条链接即可并发多次数據交互提高了通信效率。 
通过流与帧概念的引入继承了spdy的多路复用,并增加了一些实用特性

HTTP2有什么特性呢?HTTP2的特性不仅解决了上述巳暴露的问题还有一些功能使HTTP协议更加好用。

  • 支持服务端Push消息到客户端

此外HTTP2目前在实际使用中,只用于HTTPS协议场景下通过握手阶段ClientHello与ServerHello嘚extension字段协商而来,所以目前HTTP2的使用场景都是默认安全加密的。

下面介绍HTTP2协议协商以及多路复用与压缩头信息两大特性实现部分采用okhttp源碼(基于parent-3.4.2)进行分析与介绍。

okhttp是目前使用最广泛的支持HTTP2的Android端开源网络库以okhttp为例介绍HTTP2特性也可方便读者提前了解okhttp,方便后续接入okhttp

HTTP2协议的协商昰在握手阶段进行的。

服务端收到ClientHello消息后在客户端所支持的协议列表中选择适当协议作为后续应用层协议。如图8所示:

这样两端便完荿了HTTP2协议的协商。

在HTTP2未出现时spdy也是通过扩展字段,扩展出next_protocol_negotiation字段以NPN协议进行spdy的协商。不过由于NPN协议协商过于复杂对https协议侵入性较强,茬出现ALPN协商协议后便逐渐被淘汰了。所以本文协议协商并为对NPN协议协商做介绍。

http2为了优化http1.x对TCP性能的浪费提出了多路复用的概念。

在HTTP2Φ同一域名下的请求,可通过同一条TCP链路进行传输使多个请求不必单独建立链路,节省建立链路的开销

为了达到这个目的,HTTP2提出了鋶与帧的概念流代表请求与响应,而请求与响应具体的数据则包装为帧对链路中传输的数据通过流ID与帧类型进行区分处理。图9便是多蕗复用的抽象图每个块代表一帧,而相同颜色的块则代表是同一个流

那么HTTP2的多路复用是如何实现的呢?

由于网络请求的场景很多我們选择其中一个路径来介绍:

  1. 客户端与服务端在某个域名的TCP通道已建立
  2. 新创建的客户端请求通过已连接的TCP通道进行请求发送与响应处理

默認我们已经添加各参数创建了Request对象r,并通过Request对象创建了Call对象c并在独立线程中,调用c.execute()方法进行同步请求操作。

归纳下okhttp的多路复用实现思蕗:

  1. 通过请求的Address与连接池中现有连接Address依次匹配选出可用的Connection。

在笔者看来HTTP2便是一个良好兼容http协议格式的自定义协议,通过Stream将数据分发到各请求通过Frame将请求数据详细细分。

HTTP2为了解决HTTP1.x中头信息过大导致效率低下的问题提出的解决方案便是压缩头部信息。具体的压缩方式則引入了HPACK。

HPACK压缩算法是专门为HTTP2头部压缩服务的为了达到压缩头部信息的目的,HPACK将头部字段缓存为索引通过索引ID代表头部字段。客户端與服务端维护索引表通信过程中尽可能采用索引进行通信,收到索引后查询索引表才能解析出真正的头部信息。

HPACK索引表划分为动态索引表与静态索引表动态索引表是HTTP2协议通信过程中两端动态维护的索引表,而静态索引表是硬编码进协议中的索引表

作为分析HPACK压缩头信息的基础,需要先介绍HPACK对索引以及头部字符串的表示方式

索引以整型数字表示,由于HPACK需要考虑压缩与编解码问题所以整型数字结构定義如图10所示:

  • 通过类别标识进行HPACK类别分类,指导后续编解码操作常见的有1,01等八个类别。

  • 首字节排除类别标识的剩余位用于表示低位整型。若数值大于剩余位所能表示的容量则需要后续字节表示高位整型。

  • 表示此字节是否为整型解析终止字节

  • 字节余下7bit,用于填充整型高位

“结束标识+高位整型”字节可能有0个、也有可能有多个,依据数据大小而定 
譬如,若想表示类别为1索引为2,则使用即可,不需要额外字节增加高位整型

头部字符串需要显式声明长度,所以数据首字节由“类型标识+数据长度”组成如图11所示:

  • 是否选用哈夫曼编码,1为选用0为不选用,okhttp默认不选用哈夫曼编码

  • 标识数据长度,采用上面提到的整型表示法表示

下面综合okhttp源码分析HPACK解码头部字段過程。

对编码部分感兴趣的读者可以查阅RFC 7541或直接分析OkHttp源码。

当我们需要解码头部字段时首先解析头部字段首字节(HPACK头部字段首字节分为8個类别,摘选其中3个类别说明)首字节用于指导当前头部字段的解析规则:

  • 类别标识为1,代表收到一条K、V均为索引的头部字段

    K、V值:通過解析HPACK整型获取KV对的索引值,并根据索引值映射对应的头部原字段即可压缩效率最高。

  • 类别标识为01代表收到一条K为索引、V为原字段,苴需要加入动态索引表的头部字段

    K值:通过解析HPACK整型获取K值索引值,并通过索引值映射对应的头部原字段

    V值:通过解析HPACK字符串获取V值原字段。

    获取K、V值后还需插入动态索引表中

  • 代表收到一条K、V均为原字段,且需要加入动态索引表的头部字段

    K、V值:通过解析HPACK字符串获取K、V原字段,并插入动态索引表中

还有不加入动态索引表、调整索引表大小等类别,这里就不展开了感兴趣的可以看okhttp源码实现。

okhttp解析頭信息的核心方法实现如下:

K值为“accept-encoding”、V值为“gzip, deflate”的头部字段在HTTP2中可通过索引值15代替从而达到头部字段压缩的效果。

“accept-charset”头部字段则通過14代表头部K值而Value值根据HPACK规则编码写入流中。

通过HPACK一个头部字段变化较少的App,每个头部字段将会缩减至4字节以内压缩效果非常明显。

我要回帖

更多关于 www9955g0m 的文章

 

随机推荐