HTTPS协议之SSL/TLS详解(下)

目录

前言:

SSL/TLS详解

HTTP协议传输安全性分析

对称加密

非对称加密

证书

小结:


前言:

    在网络世界中,存在着运营商劫持和一些黑客的攻击。如果明文传输数据是很危险的操作,因为我们不清楚中间传输过程中就被哪个服务器偷梁换柱了。

    现在网络中大多数使用的都是HTTPS协议。HTTP协议没有加密的概念,就意味着将会进行明文传输,数据很容易就被劫持了。HTTPS协议是HTTP协议的加强版本(S就是SSL或者TLS),引入了证书的概念,很大程度上保证了数据的安全性。

SSL/TLS详解

HTTP协议传输安全性分析

注意:

    明文传输,当数据经过中间黑客控制的服务器时,数据就可以直接被篡改。服务器得到的请求就是篡改后的请求。当响应经过黑客服务器时同样也可以被篡改,那么客户端和服务器所得到的数据就是黑客说了算。就不存在安全性可言。

对称加密

    所谓对称加密就是:同一个密钥既可以加密也可以解密。

    a(明文) + key = b(密文)

    b(密文) + key = a(明文)

    不同的客户端肯定要使用不同的对称密钥来对数据进行加密。那么当客户端生成对称密钥后,就需要将对称密钥和数据一起传输到服务器,服务器才能解密数据。

问题:

    这次传输当经过中间黑客控制的服务器时,那么黑客也可以劫持到密钥,对数据解密进行篡改。那么我们只要解决对称密钥的传输数据就是安全的。

非对称加密

    生成一对密钥,公钥和私钥。用公钥加密,私钥解密(公钥是公开的,密钥是私有的)。

    明文 + 公钥 = 密文

    密文 + 私钥 = 明文

注意:

    服务器生成一对非对称密钥,公钥是公开的,密钥只有自己知道。客户端使用公钥对对称密钥加密传输到服务器。由于黑客控制的服务器不知道私钥,就没有办法解密。当服务器得到数据后,用私钥解密得到对称密钥。那么以后的传输就可以直接使用对称密钥对数据进行加密了。

    为什么有非对称加密还要使用对称加密呢?

    答:非对称加密是比较耗时,而对称加密效率高。如果每次都使用非对称加密,效率会很低。使用非对称加密将对称密钥传输到服务器后,就可以使用对称加密了。效率会有显著提升。

问题:

    中间人攻击,黑客模仿服务器也生成一对公钥和密钥,发给客户端(偷梁换柱得到明文)。由于客户端的公钥也是服务器生成好传输过去的。

注意:

    客户端需要发起请求得到服务器生成的公钥。服务器返回响应时说:公钥是pub1。经过黑客控制的服务器时,黑客保存pub1。并且自己也生成一对非对称密钥(pub2,pri2)。然后返回响应说:公钥是pub2。

    客户端用pub2对对称密钥加密。黑客服务器收到后,使用pri2解密得到对称密钥。然后又使用之前保存的pub1加密,传输到服务器。服务器任然可以使用pri1解密。黑客神不知鬼不觉黑客就得到了对称密钥。

证书

    解决中间人攻击的核心方法就是:让客户端能够辨别得到的公钥是否为服务器发来的公钥。引入一个“证书”(本质上是第三方的公证机构)。

    服务器(网站)在设立之初,需要向公证机构申请证书,服务器生成的公钥也就包含在证书中。客户端向服务器不在是请求公钥了,而是把整个证书都请求过来。

    客户端拿到证书后,就会对证书进行校验。验证一下证书是否是被篡改过的(证书中存在一个加密的签名)。如果证书是无效的,浏览器就会直接弹窗告警。

注意:

    服务器在建立时向认证机构申请证书(提交一些信息,包含公钥),认证机构就会向服务器颁发证书,包含认证机构用自己私钥加密的签名。客户端向服务器请求证书就会获得证书(包含公钥)。

    客户端用认证机构提供的公钥解密签名进行校验(校验的过程类似tcp/udp校验和)。签名是根据证书中内容来生成的,客户端得到数据后,重新根据数据计算一次签名,与之前的签名进行对比。辨别数据是否被篡改。

    黑客如果把证书中的公钥篡改了,客户端计算的签名就会和证书中的签名不一致。黑客根据自己的算法重新生成签名(把签名篡改了)。由于黑客不知道认证机构的私钥,就算生成了也无法加密。黑客直接模仿认证机构重新生成证书,也由于黑客不知道认证机构的私钥,无法生成。

    整个过程就类似于我们使用身份证来证明身份,警察局就是第三方认证机构。这个身份证无法被别人生成,别人就可以通过身份证来辨别我们的身份。

小结:

    理解HTTPS协议的加密过程,当我们使用其协议时就会比较得心应手了。

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
SSL(Secure Sockets Layer)是一种安全协议,用于加密数据传输,以确保数据的机密性和完整性。Python中的ssl模块提供了对SSL协议的支持,可以用于创建安全的客户端和服务器应用程序。 以下是ssl模块的一些常用功能: 1. 创建 SSL/TLS 安全连接 使用ssl.wrap_socket()函数可以将一个普通的socket对象转换成一个SSL/TLS安全连接的socket对象。例如: ``` import socket import ssl # 创建普通的socket对象 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 将socket对象转换成SSL/TLS安全连接的socket对象 ssl_sock = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_TLS) ``` 2. 验证服务器证书 使用ssl.wrap_socket()函数时,可以通过参数ca_certs指定一个证书文件,用于验证服务器发送的证书是否有效。例如: ``` import socket import ssl # 创建普通的socket对象 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 将socket对象转换成SSL/TLS安全连接的socket对象,并验证服务器证书 ssl_sock = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_TLS, ca_certs="server.crt") ``` 3. 验证客户端证书 使用ssl.wrap_socket()函数时,可以通过参数certfile指定一个证书文件,用于客户端向服务器验证自己的身份。例如: ``` import socket import ssl # 创建普通的socket对象 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 将socket对象转换成SSL/TLS安全连接的socket对象,并验证服务器证书和客户端证书 ssl_sock = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_TLS, ca_certs="server.crt", certfile="client.crt", keyfile="client.key") ``` 4. 加载证书和密钥 使用ssl.load_cert_chain()函数可以加载一个证书和密钥,用于创建SSL/TLS安全连接。例如: ``` import socket import ssl # 创建普通的socket对象 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 加载证书和密钥 ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_context.load_cert_chain(certfile="server.crt", keyfile="server.key") # 将socket对象转换成SSL/TLS安全连接的socket对象 ssl_sock = ssl_context.wrap_socket(sock, server_side=True) ``` 以上是ssl模块的一些常用功能,使用ssl模块可以方便地创建安全的客户端和服务器应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小太空人w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值