`
maosheng
  • 浏览: 560402 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HTTPS的加密原理解读

 
阅读更多
一、为什么需要加密?
因为http的内容是明文传输的,明文数据会经过中间代理服务器、路由器、wifi热点、通信服务运营商等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双方察觉,这就是中间人攻击。所以我们才需要对信息进行加密。最容易理解的就是对称加密 。

二、什么是对称加密?
简单说就是有一个密钥,它可以加密一段信息,也可以对加密后的信息进行解密,和我们日常生活中用的钥匙作用差不多。

对称加密(https://sectigostore.com/blog/types-of-encryption-what-to-know-about-symmetric-vs-asymmetric-encryption/)
用对称加密可行吗?
如果通信双方都各自持有同一个密钥,且没有别人知道,这两方的通信安全当然是可以被保证的(除非密钥被破解)。

然而最大的问题就是这个密钥怎么让传输的双方知晓,同时不被别人知道。如果由服务器生成一个密钥并传输给浏览器,那在这个传输过程中密钥被别人劫持到手了怎么办?之后他就能用密钥解开双方传输的任何内容了,所以这么做当然不行。

换种思路?试想一下,如果浏览器内部就预存了网站A的密钥,且可以确保除了浏览器和网站A,不会有任何外人知道该密钥,那理论上用对称加密是可以的,这样浏览器只要预存好世界上所有HTTPS网站的密钥就行了!这么做显然不现实。
怎么办?所以我们就需要非对称加密 。

三、什么是非对称加密?
简单说就是有两把密钥,通常一把叫做公钥、一把叫私钥,用公钥加密的内容必须用私钥才能解开,同样,私钥加密的内容只有公钥能解开。

非对称加密(https://sectigostore.com/blog/types-of-encryption-what-to-know-about-symmetric-vs-asymmetric-encryption/)

四、用非对称加密可行吗?
鉴于非对称加密的机制,我们可能会有这种思路:服务器先把公钥以明文方式传输给浏览器,之后浏览器向服务器传数据前都先用这个公钥加密好再传,这条数据的安全似乎可以保障了!因为只有服务器有相应的私钥能解开公钥加密的数据。

然而反过来由服务器到浏览器的这条路怎么保障安全?如果服务器用它的私钥加密数据传给浏览器,那么浏览器用公钥可以解密它,而这个公钥是一开始通过明文传输给浏览器的,若这个公钥被中间人劫持到了,那他也能用该公钥解密服务器传来的信息了。所以目前似乎只能保证由浏览器向服务器传输数据的安全性(其实仍有漏洞,下文会说),那利用这点你能想到什么解决方案吗?

五、改良的非对称加密方案,似乎可以?
我们已经理解通过一组公钥私钥,可以保证单个方向传输的安全性,那用两组公钥私钥,是否就能保证双向传输都安全了?请看下面的过程:

某网站服务器拥有公钥A与对应的私钥A’;浏览器拥有公钥B与对应的私钥B’。
浏览器把公钥B明文传输给服务器。
服务器把公钥A明文给传输浏览器。
之后浏览器向服务器传输的内容都用公钥A加密,服务器收到后用私钥A’解密。由于只有服务器拥有私钥A’,所以能保证这条数据的安全。
同理,服务器向浏览器传输的内容都用公钥B加密,浏览器收到后用私钥B’解密。同上也可以保证这条数据的安全。
的确可以!抛开这里面仍有的漏洞不谈(下文会讲),HTTPS的加密却没使用这种方案,为什么?很重要的原因是非对称加密算法非常耗时,而对称加密快很多。那我们能不能运用非对称加密的特性解决前面提到的对称加密的漏洞?

六、非对称加密+对称加密?
既然非对称加密耗时,那非对称加密+对称加密结合可以吗?而且得尽量减少非对称加密的次数。当然是可以的,且非对称加密、解密各只需用一次即可。
请看一下这个过程:

某网站拥有用于非对称加密的公钥A、私钥A’。
浏览器向网站服务器请求,服务器把公钥A明文给传输浏览器。
浏览器随机生成一个用于对称加密的密钥X,用公钥A加密后传给服务器。
服务器拿到后用私钥A’解密得到密钥X。
这样双方就都拥有密钥X了,且别人无法知道它。之后双方所有数据都通过密钥X加密解密即可。
完美!HTTPS基本就是采用了这种方案。完美?还是有漏洞的。

七、中间人攻击
中间人攻击(https://blog.pradeo.com/man-in-the-middle-attack)
如果在数据传输过程中,中间人劫持到了数据,此时他的确无法得到浏览器生成的密钥X,这个密钥本身被公钥A加密了,只有服务器才有私钥A’解开它,然而中间人却完全不需要拿到私钥A’就能干坏事了。请看:

某网站有用于非对称加密的公钥A、私钥A’。
浏览器向网站服务器请求,服务器把公钥A明文给传输浏览器。
中间人劫持到公钥A,保存下来,把数据包中的公钥A替换成自己伪造的公钥B(它当然也拥有公钥B对应的私钥B’)。
浏览器生成一个用于对称加密的密钥X,用公钥B(浏览器无法得知公钥被替换了)加密后传给服务器。
中间人劫持后用私钥B’解密得到密钥X,再用公钥A加密后传给服务器。
服务器拿到后用私钥A’解密得到密钥X。
这样在双方都不会发现异常的情况下,中间人通过一套“狸猫换太子”的操作,掉包了服务器传来的公钥,进而得到了密钥X。根本原因是浏览器无法确认收到的公钥是不是网站自己的,因为公钥本身是明文传输的,难道还得对公钥的传输进行加密?这似乎变成鸡生蛋、蛋生鸡的问题了。解法是什么?

八、如何证明浏览器收到的公钥一定是该网站的公钥?
其实所有证明的源头都是一条或多条不证自明的“公理”(可以回想一下数学上公理),由它推导出一切。比如现实生活中,若想证明某身份证号一定是小明的,可以看他身份证,而身份证是由政府作证的,这里的“公理”就是“政府机构可信”,这也是社会正常运作的前提。

那能不能类似地有个机构充当互联网世界的“公理”呢?让它作为一切证明的源头,给网站颁发一个“身份证”?

它就是CA机构,它是如今互联网世界正常运作的前提,而CA机构颁发的“身份证”就是数字证书。

九、数字证书
网站在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书持有者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明“该公钥对应该网站”。而这里又有一个显而易见的问题,“证书本身的传输过程中,如何防止被篡改”?即如何证明证书本身的真实性?身份证运用了一些防伪技术,而数字证书怎么防伪呢?解决这个问题我们就接近胜利了!

十、如何放防止数字证书被篡改?
我们把证书原本的内容生成一份“签名”,比对证书内容和签名是否一致就能判别是否被篡改。这就是数字证书的“防伪技术”,这里的“签名”就叫数字签名:

数字签名
这部分内容建议看下图并结合后面的文字理解,图中左侧是数字签名的制作过程,右侧是验证过程:


数字签名的生成与验证(https://cheapsslsecurity.com/blog/digital-signature-vs-digital-certificate-the-difference-explained/)

数字签名的制作过程:

CA机构拥有非对称加密的私钥和公钥。
CA机构对证书明文数据T进行hash。
对hash后的值用私钥加密,得到数字签名S。
明文和数字签名共同组成了数字证书,这样一份数字证书就可以颁发给网站了。
那浏览器拿到服务器传来的数字证书后,如何验证它是不是真的?(有没有被篡改、掉包)

浏览器验证过程:

拿到证书,得到明文T,签名S。
用CA机构的公钥对S解密(由于是浏览器信任的机构,所以浏览器保有它的公钥。详情见下文),得到S’。
用证书里指明的hash算法对明文T进行hash得到T’。
显然通过以上步骤,T’应当等于S‘,除非明文或签名被篡改。所以此时比较S’是否等于T’,等于则表明证书可信。
为何么这样可以保证证书可信呢?我们来仔细想一下。

中间人有可能篡改该证书吗?
假设中间人篡改了证书的原文,由于他没有CA机构的私钥,所以无法得到此时加密后签名,无法相应地篡改签名。浏览器收到该证书后会发现原文和签名解密后的值不一致,则说明证书已被篡改,证书不可信,从而终止向服务器传输信息,防止信息泄露给中间人。

既然不可能篡改,那整个证书被掉包呢?

中间人有可能把证书掉包吗?
假设有另一个网站B也拿到了CA机构认证的证书,它想劫持网站A的信息。于是它成为中间人拦截到了A传给浏览器的证书,然后替换成自己的证书,传给浏览器,之后浏览器就会错误地拿到B的证书里的公钥了,这确实会导致上文“中间人攻击”那里提到的漏洞?

其实这并不会发生,因为证书里包含了网站A的信息,包括域名,浏览器把证书里的域名与自己请求的域名比对一下就知道有没有被掉包了。

为什么制作数字签名时需要hash一次?
我初识HTTPS的时候就有这个疑问,因为似乎那里的hash有点多余,把hash过程去掉也能保证证书没有被篡改。

最显然的是性能问题,前面我们已经说了非对称加密效率较差,证书信息一般较长,比较耗时。而hash后得到的是固定长度的信息(比如用md5算法hash后可以得到固定的128位的值),这样加解密就快很多。

当然也有安全上的原因,这部分内容相对深一些,感兴趣的可以看这篇解答:crypto.stackexchange.com/a/12780

怎么证明CA机构的公钥是可信的?
你们可能会发现上文中说到CA机构的公钥,我几乎一笔带过,“浏览器保有它的公钥”,这是个什么保有法?怎么证明这个公钥是否可信?

让我们回想一下数字证书到底是干啥的?没错,为了证明某公钥是可信的,即“该公钥是否对应该网站”,那CA机构的公钥是否也可以用数字证书来证明?没错,操作系统、浏览器本身会预装一些它们信任的根证书,如果其中会有CA机构的根证书,这样就可以拿到它对应的可信公钥了。

实际上证书之间的认证也可以不止一层,可以A信任B,B信任C,以此类推,我们把它叫做信任链或数字证书链。也就是一连串的数字证书,由根证书为起点,透过层层信任,使终端实体证书的持有者可以获得转授的信任,以证明身份。

另外,不知你们是否遇到过网站访问不了、提示需安装证书的情况?这里安装的就是根证书。说明浏览器不认给这个网站颁发证书的机构,那么你就得手动下载安装该机构的根证书(风险自己承担XD)。安装后,你就有了它的公钥,就可以用它验证服务器发来的证书是否可信了。


信任链(https://publib.boulder.ibm.com/tividd/td/TRM/GC32-1323-00/en_US/HTML/admin230.htm)
每次进行HTTPS请求时都必须在SSL/TLS层进行握手传输密钥吗?
这也是我当时的困惑之一,显然每次请求都经历一次密钥传输过程非常耗时,那怎么达到只传输一次呢?

服务器会为每个浏览器(或客户端软件)维护一个session ID,在TLS握手阶段传给浏览器,浏览器生成好密钥传给服务器后,服务器会把该密钥存到相应的session ID下,之后浏览器每次请求都会携带session ID,服务器会根据session ID找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了!







分享到:
评论

相关推荐

    数字证书原理,公钥私钥加密原理

    以下是对数字证书原理和公钥私钥加密原理的详细解读。 数字证书是一种安全证书,用来证明某一实体(如个人、服务器或组织)的身份,它是由一个权威的认证机构(CA)签发的。数字证书包含的主要信息有证书拥有者的...

    https原理:证书传递、验证和数据加密、解密过程解析

    在整个过程中,由于数据在传输过程中始终处于加密状态,第三方即便能捕获数据包也无法解读其内容,从而保证了通信的安全性。HTTPS的使用对于保护用户的敏感信息,如登录凭据、信用卡号等至关重要,特别是在涉及金融...

    HTTPS原理与证书实践1

    - 对称加密算法:通过共享密钥加密和解密数据,确保只有通信双方能解读信息,提高了安全性。 1.2.2 如何保证数据的完整性 - 单项加密算法:通过计算数据的特征码(如哈希值)来验证数据在传输过程中是否被修改。...

    Https原理及流程.docx

    为了解决这个问题,Netscape公司开发了HTTPS协议,它利用加密技术将数据转化为密文进行传输,即使数据被截取,攻击者也无法轻易解读。 密码学是HTTPS实现安全的基础,主要包括对称加密和非对称加密两种方式。对称...

    JS加密C#解密

    首先,我们需要了解JavaScript(JS)加密的基本原理。JavaScript是一种广泛应用于网页开发的脚本语言,可以用于客户端的数据处理。为了加密数据,开发者通常会使用各种加密算法,如对称加密(如AES、DES)和非对称...

    Android设计思想解读开源框架.pdf

    - **SSL/TLS加密**:用于保护数据的安全传输。 - **WebSocket**:一种双向通信协议,用于实现实时数据传输。 **5.2 OkHttp源码解读** - **连接池**:OkHttp通过连接池复用HTTP连接,减少网络延迟。 - **请求队列**...

    简单数据通信加密DLL文件

    这个"简单数据通信加密DLL文件"很可能提供了一种简易的加密机制,用于保护在网络中传输的数据不被非法获取和解读。DLL(动态链接库)文件是Windows操作系统中的一个重要组成部分,它包含可由多个程序同时使用的代码...

    基于SSL的身份认证和访问控制实现原理.pdf

    而加密算法则确定了数据如何被加密和解密,确保数据在传输过程中即使被截获也无法被第三方解读。 SSL技术的出现,极大地提升了网络通信的安全性,避免了用户敏感信息在互联网传输中的泄露风险,从而在电子商务、...

    URL路径加密

    URL加密是指通过对URL中的某些部分或全部进行加密处理,使其在传输过程中不被轻易解读,从而达到保护用户信息安全的目的。本文将重点介绍一种基于DES(Data Encryption Standard,数据加密标准)算法实现的URL加密...

    SSL原理及应用

    SSL/TLS工作在传输层之上,其作用在于为传输层的数据提供安全保护,使得即使在网络层和数据链路层的数据传输过程中被拦截,也无法解读应用层的敏感信息。这主要通过公钥和私钥加密技术实现,公钥用于加密,私钥用于...

    文件加密

    下面,我们将深入探讨文件加密的基本概念、工作原理、常见算法以及如何在实际操作中实施文件加密。 首先,我们要理解什么是加密。加密是利用特定的算法,通常称为加密算法,对数据进行编码的过程。这个过程需要一个...

    文件加密器

    一旦文件被加密,如果没有正确的密钥,即使是非法获取了文件,也无法解读其中的内容。在解密阶段,密文使用相同的密钥恢复为原来的明文,完成解密。 二、常见的文件加密算法 1. 对称加密算法:如DES(Data ...

    软件设计加密解密详述

    首先,我们需要理解加密和解密的基本原理。加密是将明文(可读数据)转化为密文(不可读数据)的过程,而解密则是将密文恢复为明文的逆过程。这两个过程通常由加密算法和解密算法共同完成,它们之间必须保持一种数学...

    加密算法总结

    加密算法是一种用于保护数据安全的技术手段,通过将明文(原始数据)转换为密文(加密后的数据),确保即使数据被截获也无法被轻易解读。这一过程依赖于加密算法及其密钥。加密算法通常分为两大类:对称加密和非对称...

    《加密技术内幕》配套光盘说明

    《加密技术内幕》这本书的配套光盘提供了丰富的资源,对于初学者来说,它是一个宝贵的资料库,可以帮助深入理解加密原理及其应用。以下将对这个光盘包含的知识点进行详细阐述。 首先,我们要明确加密的基本概念。...

    pushlet 之 官方示例解读与改造

    2. **增强安全性**:默认示例可能没有充分考虑安全问题,如未加密传输、认证不足等。可以增加SSL/TLS支持,实现用户认证机制,防止非法订阅和消息篡改。 3. **扩展消息类型**:官方示例可能只支持文本消息,我们...

    加密解密软件

    一、加密技术原理 1. 对称加密:在这种方法中,加密和解密使用的是同一密钥,例如DES(Data Encryption Standard)、AES(Advanced Encryption Standard)等。对称加密速度快,适合大量数据的加密,但密钥管理困难...

    软件设计《加密解密技术内幕

    本教程“软件设计《加密解密技术内幕》”深入探讨了这一主题,旨在帮助软件开发者理解加密的基本原理,以及如何在软件发布时有效地保护自己的成果。 首先,我们来了解一下加密的定义。加密是一种将明文(可读数据)...

    网站加密技术

    在探讨“网站加密技术”这一主题时,我们不仅限于表面的代码片段,而是深入剖析其背后的原理与应用,以确保网站的安全性。网站加密技术是保护网站数据、用户隐私和交易安全的关键手段,它通过一系列算法和技术,将...

Global site tag (gtag.js) - Google Analytics