https原理探究

https原理探究

1. 概述

  • 这里会循序渐进的讲解:明文传输、对称加密、非对称加密、结合对称非对称加密、CA证书授权。

  • https为了保证安全性以及效率,采取的措施:非对称加密、对称加密,、CA

  • 这里参考的网址:HTTPS原理全解析

2. 明文传输

  • 传输过程如下图:

在这里插入图片描述

  • 可以看到黑客很容易截取我们的请求,导致传输的数据泄露,因此不可取。

3. 对称加密

  • 对称加密需要两个函数:加密函数 f1,解密函数f2,同时还需要一个秘钥K,对于给定数据data,有:

f 1 ( K , d a t a ) = X f 2 ( K , X ) = d a t a f_1(K, data) = X \\ f_2(K, X) = data f1(K,data)=Xf2(K,X)=data

  • 此时我们传输密文X即可,传输过程如下:

在这里插入图片描述

  • 这样其实也是存在问题的。

  • 首先,服务端不可能存储和所有客户端对应的K,一方面十分浪费空间,另一方面服务端实现也不知道哪些客户端会连接。因此服务端可以保存一个K

  • 那这样黑客也可以作为客户端获取这个K,这样别的客户端和服务端通信的数据也可以被黑客解密,因此不安全。

4. 非对称加密

  • 非对称加密最常见的是RSA,关于该加密算法请参考:RSA公钥加密算法

  • 加密解密需要一个函数f,同时需要公钥PK,私钥SK,对于给定数据data,有:

f ( P K , d a t a ) = Y f ( S K , Y ) = d a t a f ( S K , d a t a ) = Y ′ f ( P K , Y ′ ) = d a t a f(PK, data) = Y \\ f(SK, Y) = data \\ f(SK, data) = Y' \\ f(PK, Y') = data f(PK,data)=Yf(SK,Y)=dataf(SK,data)=Yf(PK,Y)=data

在这里插入图片描述

  • 这种方式也存在问题。

  • 客户端给服务端发送的数据Y是用公钥进行加密的,因此只有服务端可以解密。但是服务端给客户端发送的数据不能使用公钥加密,因为客户端没有私钥,无法还原数据,因此服务端只能使用私钥加密,这样的话Y'可以被黑客解密,因为公钥是公开的,不安全。

  • 解决办法之一:客户端也存储自己的公钥、私钥,将自己的公钥发给服务端,服务端使用客户端的公钥进行加密,这样也能保证服务端向客户端发送数据的安全性了。这样其实也是不可取的,原因有两点:

    • (1)但是非对称加密计算量太大;

    • (2)存在中间人问题。

5. 结合对称、非对称加密

  • 使用非对称加密、对称加密两种方式确保数据安全传输。分为两个阶段:

    • (1)使用非对称加密协商之后对称加密需要的K

    • (2)使用对称加密进行传输数据。

  • 流程图如下:

在这里插入图片描述

  • 这种方式的话,第(1)步黑客无法获知K,并且每个客户端和服务端都可以协商属于该连接的K,看似十分安全了,但是还是存在问题:中间人问题,如下图:

在这里插入图片描述

  • 可以看到中间通信过程都被黑客劫持了,黑客可以获得协商的K,因此黑客可以获取通信双方的任何信息。

6. CA证书授权

  • CA:全称Certificate Authority,是一个机构,这个机构负责给网站颁发证书。

  • CA会有一系列安全的CPK、CSK,一个网站服务端有自己的PK、SK,网站的PK通过CSK进行加密得到网站的license,即:

f ( C S K , P K ) = l i c e n s e f(CSK, PK) = license f(CSK,PK)=license

  • 这个证书license会保存在服务端,CA的目的就是保证证书不会被被中间的黑客篡改,如果被中间人(黑客)篡改的话,这个中间人(黑客)还需要向CA机构认证。

  • CA的原理就是利用了非对称加密的应用:私钥签名。

  • 这样整个传输过程如下(参考网址):

在这里插入图片描述

  • 客户端本地存储的有机构的公钥,这样就可以防止公钥被黑客篡改,加上私钥签名,确保了license的可靠性,cmd中输入certmgr.msc可以查看本地公钥,如下图:

在这里插入图片描述

  • 保留了证书的安全性之后,我们就可以得到正确的服务器端公钥,然后将会话秘钥使用该公钥加密传输给服务端,即使中间被劫持黑客也不能解密,因为秘钥只在服务端存在。

  • 之后通过会话秘钥(对称加密)就可以传输数据了。

  • 这种方式既保证了安全性,同时最后传输使用对称加密,降低了计算量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
dynamic_cast是C++中的一个类型转换运算符,用于在多态继承关系中进行类型转换。它的原理是基于虚函数表的判断。使用dynamic_cast进行类型转换的前提是被转换的类必须有虚函数,即需要存在虚函数表。dynamic_cast通过检查对象的虚函数表来确定对象的实际类型,从而正确进行类型转换。 当进行dynamic_cast转换时,首先会检查待转换的指针是否有效,如果指针为空指针,则转换失败。接下来,dynamic_cast会在待转换对象的虚函数表中查找目标类型的虚函数表指针。如果找到了匹配的虚函数表指针,则转换成功。否则,转换失败。 在多态继承中,每个对象都有一个虚函数表,其中存储了该对象的动态类型和对应的虚函数地址。dynamic_cast会比较待转换对象的虚函数表指针与目标类型的虚函数表指针,如果相同,则说明待转换对象是目标类型或者目标类型的派生类,转换成功。如果虚函数表指针不同,则说明待转换对象不是目标类型或者目标类型的派生类,转换失败。 需要注意的是,dynamic_cast只能用于含有虚函数的类之间的转换,且只能在多态继承中进行向下转换(派生类向基类转换)或者跨层继承中进行交叉转换(两个不同派生类之间的转换)。如果转换失败,则返回空指针或者抛出std::bad_cast异常。 总结起来,dynamic_cast通过检查对象的虚函数表来进行类型转换,判断待转换对象的实际类型是否与目标类型匹配,从而决定转换的成功与否。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [深入解析C++中的动态类型转换与静态类型转换运算符](https://download.csdn.net/download/weixin_38550722/12800922)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [dynamic_cast使用以及原理探究](https://blog.csdn.net/Ray_H5/article/details/127064731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值