3.比 HTTP 更安全的 HTTPS(工作原理理解、非对称加密理解、证书理解)

所谓的协议

  1. 协议只是一种规则,你不按规则来就无法和目标方进行你的工作

  2. 协议说白了只是人定的规则,任何人都可以定协议

  3. 我们不需要太了解细节,这些制定和完善协议的人去做的,我们只需要知道协议的一个大概


HTTPS 协议

1、概述
  1. HTTPS(Hypertext Transfer Protocol Secure)是一种安全的超文本传输协议,主要用于在客户端和服务器之间安全地传输数据

  2. HTTPS 在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性

  3. HTTPS 的安全基础是 SSL(Secure Sockets Layer,安全套接字层)协议或其继任者 TLS(Transport Layer Security,传输层安全性)协议

2、优缺点
(1)优点
  1. 数据加密:通过 SSL/TLS 协议对传输的数据进行加密,保护用户隐私和敏感信息

  2. 身份验证:通过 SSL/TLS 证书对服务器进行身份验证,确保用户连接的是合法的服务器,防止中间人攻击

  3. 数据完整性:使用消息认证码等机制确保数据在传输过程中不被篡改

  4. 信任度高:使用 HTTPS 的网站会获得更高的信任度,因为 HTTPS 被视为安全可靠的通信方式

(2)缺点
  1. 性能开销:加密和解密数据会增加服务器和客户端的计算量

  2. 成本高昂:获取和维护 SSL/TLS 证书需要一定的成本和技术支持

  3. 部署复杂:需要在服务器端配置和管理 SSL/TLS 证书

  4. 缓存限制:HTTPS 通信不能像 HTTP 一样被中间设备缓存

3、工作原理
(1)客户端发起连接请求
  1. 客户端尝试访问一个 HTTPS 网站,例如,https://www.example.com

  2. 客户端发起一个到服务器 443 端口的连接请求(HTTPS 默认端口)

(2)服务器返回证书和相关信息
  1. 服务器响应客户端的连接请求,并发送其 SSL/TLS 证书,这个证书通常包含服务器的公钥、服务器的名称(通常是域名)、证书颁发机构(CA)的信息、证书的有效期等

  2. 服务器还可能发送其他 SSL/TLS 握手消息,包括它支持的加密套件列表等

(3)客户端验证服务器证书的合法性
  • 客户端收到服务器的证书后,会进行一系列验证步骤来确保证书的合法性,如果证书验证失败,客户端会向用户显示一个错误消息,并可能阻止连接
  1. 检查证书是否由受信任的证书颁发机构(CA)签发

  2. 检查证书是否已过期

  3. 检查证书上的域名是否与正在访问的域名匹配(防止域名欺骗)

  4. 可能还会检查证书链(如果服务器证书是由中间 CA 签发的),以确保整个链都是有效的

假设用户试图访问 https://www.example.com,但服务器返回的证书是为 https://www.malicious-example.com 签发的
客户端会检查证书上的域名,发现与正在访问的域名不匹配,因此会向用户显示一个“证书不匹配”的错误消息,并阻止连接
(4)客户端生成随机数并加密发送给服务器
  1. 一旦客户端验证了服务器的证书,它会生成一个随机数,这通常称为“预主密钥”或“客户端随机数”

  2. 客户端使用服务器证书中的公钥对这个随机数进行加密,并将加密后的结果发送给服务器

1、客户端生成一个随机数 ClientRandom
2、客户端使用服务器证书中的公钥对 ClientRandom 进行加密,得到 EncryptedClientRandom
3、客户端将 EncryptedClientRandom 发送给服务器
(5)服务器解密随机数并生成会话密钥
  1. 服务器收到 EncryptedClientRandom 后,使用自己的私钥进行解密,得到原始的 ClientRandom

  2. 服务器也会生成一个随机数,通常称为“服务器随机数”

  3. 服务器将 ClientRandomServerRandom 以及其他参数(例如,加密算法、哈希算法)组合在一起,通过一系列复杂的计算生成一个会话密钥,通常称为“主密钥”或“会话密钥”

1、服务器解密得到 ClientRandom
2、服务器生成一个随机数 ServerRandom
3、服务器将 ClientRandom、ServerRandom 以及选择的加密算法和哈希算法组合在一起,通过预定的密钥交换算法(如 Diffie-Hellman 或 RSA 密钥交换)计算出会话密钥 SessionKey
(6)双方使用会话密钥进行通信
  1. 一旦会话密钥生成,客户端和服务器都会使用这个密钥对后续的数据进行加密和解密

  2. 这种加密通常是使用对称加密算法(例如,AES)进行的,因为对称加密算法在处理大量数据时比公钥加密算法(例如,RSA)更快

1. 客户端想要发送一条消息给服务器
2. 客户端使用会话密钥 SessionKey 对消息进行加密,得到密文
3. 客户端将密文发送给服务器
4. 服务器收到密文后,使用相同的会话密钥 SessionKey 对密文进行解密,得到原始的消息

内容补充

1、非对称加密
(1)基本介绍
  1. 公钥加密:发送方使用接收方的公钥来加密消息,这样只有拥有对应私钥的接收方才能解密这条消息,从而保证了消息的安全性和隐私性

  2. 私钥解密:接收方使用自己的私钥来解密由发送方使用公钥加密的消息,由于私钥是保密的,只有接收方自己知道,因此只有接收方能够读取这条消息

(2)代码演示
  • 这里使用 Java 加密扩展(Java Cryptography Extension,JCE)来实现非对称加密
  1. 生成 RSA 密钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048, new SecureRandom());
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
  1. 准备待加密的数据
String originalData = "Hello World";
byte[] originalDataBytes = originalData.getBytes();
  1. 使用公钥加密数据
Cipher encryptCipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedData = encryptCipher.doFinal(originalDataBytes);
String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedData);
System.out.println("Encrypted - Base64: " + encryptedDataBase64);
  1. 使用私钥解密数据
Cipher decryptCipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = decryptCipher.doFinal(encryptedData);
String decryptedDataString = new String(decryptedData);
System.out.println("Decrypted: " + decryptedDataString);
2、证书签发
(1)自签名证书
  1. 会有不是由证书颁发机构(CA)签发的证书,这些证书通常被称为自签名证书(self-signed certificates)或内部证书(internal certificates)

  2. 它们可能由组织内部创建,用于测试、开发或内部网络中的通信

  3. 自签名证书是由创建证书的同一实体(例如,一个组织或开发者)签名和颁发的,而不是由公认的、独立的第三方证书颁发机构(CA)签发的

  4. 因此,自签名证书通常不会被大多数操作系统、浏览器或应用程序默认信任,因为它们没有被广泛认可的根证书颁发机构所背书

  5. 在开发和测试环境中,使用自签名证书是很常见的,因为它们允许你设置一个加密的、安全的 HTTPS 连接,而无需购买和配置来自 CA 的证书,然而,在使用自签名证书时,需要在客户端(例如,Android 应用程序)中配置信任存储或信任管理器,以显式地信任这些证书

(2)CA 签发证书
  1. 在生产环境中,应该始终使用由受信任的 CA 签发的证书,以确保你的 HTTPS 连接的安全性和可信度

  2. 这些证书经过了严格的验证和审计,并且被广泛认可和信任,使用来自 CA 的证书可以确保应用程序与服务器之间的通信受到加密保护,并且可以验证服务器的身份,从而防止中间人攻击和其他安全威胁

3、客户端差异性
  • 浏览器能直接发送 HTTPS 请求,而 Java 请求库不能直接请求,它们有如下差异
  1. 浏览器内置支持 HTTPS,浏览器通过内置的 SSL/TLS 协议栈来处理 HTTPS 请求,确保数据传输的安全性

  2. Java 请求库虽然也支持HTTPS请求,但通常需要开发者进行额外的配置,这包括设置 SSL/TLS 协议版本、信任库(TrustStore)和密钥库(KeyStore)等,如果没有正确配置,就可能导致请求失败

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419465.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言深入理解指针4

1.回调函数 回调函数是通过函数指针调用的函数 将函数指针作为参数传递给另一个函数,当这个函数指针被用来调用其所指向的函数时,被调用的函数就是回调函数,回调函数不是应该由该函数的实现方直接调用,而是在特定的事件或条件发生…

MATLAB-基于高斯过程回归GPR的数据回归预测

目录 目录 1 介绍 1. 1 高斯过程的基本概念 1.2 核函数(协方差函数) 1.3 GPR 的优点 1.4. GPR 的局限 2 运行结果 3 核心代码 1 介绍 高斯过程回归(Gaussian Process Regression, GPR)是一种强大的非参数贝叶斯方法&…

CAN总线的位同步详细讲解

接收方数据采样 (1)CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长 (2)发送方以约定的位时长每隔固定时间输出一个数据位 (3)接收方以约定的位时长每隔固定…

C++入门基础篇

引言 说到编程语言常常听到的就是C语言C Java 。C语言是面向过程的,C是和Java是面向对象的,那么什么是面向对象呢?什么又是面向过程呢?C是什么?封装、继承、多态是什么?且听我絮絮叨叨。 C入门基础 1.命名…

24-9-8-读书笔记(十七)-《契诃夫文集》(三)([俄] 契诃夫 [译] 汝龙 )

文章目录 《契诃夫文集》(三)([俄] 契诃夫 [译] 汝龙 )目录阅读笔记记录总结 《契诃夫文集》(三)([俄] 契诃夫 [译] 汝龙 ) 9月,好月份,秋高气爽,…

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

SQL语句中in条件超过1000怎么办?

博客主页: 南来_北往 系列专栏:Spring Boot实战 引言 当遇到SQL语句中IN条件超过1000个的情况时,可以采取以下几种策略来有效处理这一问题: 使用临时表:将IN列表中的值存储在临时表中,并将该临时表与查询表进行J…

初识redis(String,Hash,List,Set,SortedSet)

认识NoSql sql关系型数据库 nosql非关系型数据库 nosql具有非结构化,Key/Value,Document,Draph 无关联的,非sql,BASE(原子性,持久性,一致性,隔离性) 认识r…

数组与贪心算法——179、56、57、228(2简2中)

179. 最大数(简单) 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 解法一、自定义比较…

Linux-RPM与YUM

目录 前言: rpm包的管理 rpm包的简单查询指令 ​编辑 rpm包名的基本格式 rpm包名基本格式 ​编辑 卸载rpm包 细节问题 安装rpm包 yum yum的基本指令 安装指定的yum包 yum报错 问题描述: 解决方法: 前言: Linux操…

模型压缩之剪枝

(1)通道选择 这里要先解释一下: (1)通道剪枝 那我们实际做法不是上面直接对所有层都添加L1正则项,而是仅仅对BN层权重添加L1正则项。通道剪枝具体步骤如下: 1.BN层权重添加L1正则项&#xf…

还不懂BIO,NIO,AIO吗

BIO(Blocking I/O)、NIO(Non-blocking I/O)和 AIO(Asynchronous I/O)是 Java 中三种不同的 I/O 模型,主要用于处理输入 / 输出操作。 一、BIO(Blocking I/O) 定义与工作原…

ANSA联合ABAQS基于梁单元的螺栓预紧力分析实例

1、在螺栓孔之间创建一个模拟螺栓 ABAQUS界面→AUXILIARIES→bolt→分鳖选择上下两圈节点,这样在螺栓孔中间就会生成一个梁单元。 中键确定,因为螺杆使用的是变形体,所以接下来需要为其创建一个属性: 单击ok,完成虚拟螺栓的创建,该螺栓两端是刚性MPC,中间是弹性的梁单元…

美畅物联丨科技赋能校车安全:智慧监控管理系统的创新应用

1、背景 1.1应用需求 孩子,作为国家未来的希望之星和民族发展的潜力所在,其安全与健康向来都是社会瞩目的核心要点。校车,作为孩子们日常出行的关键交通载体,其安全性更是时刻牵动着每一个家庭的敏感神经。然而,不可…

利用TCP编程实现FTP功能

模拟FTP核心原理:客户端连接服务器后,向服务器发送一个文件。文件名可以通过参数指定,服务器端接收客户端传来的文件(文件名随意),如果文件不存在自动创建文件,如果文件存在,那么清空…

828华为云征文|使用sysbench对Mysql应用加速测评

文章目录 ❀前言❀测试环境准备❀测试工具选择❀测试工具安装❀mysql配置❀未开启Mysql加速测试❀开启Mysql加速测试❀总结 ❀前言 大家好,我是早九晚十二。 昨天有梳理一篇关于华为云最新推出的云服务器产品Flexus云服务器X。当时有说过,这次的华为云F…

【科研小白系列】使用screen创建虚拟终端,实现本地关机后服务器仍然跑模型

博主简介:努力学习的22级计算机科学与技术本科生一枚🌸博主主页: 是瑶瑶子啦往期回顾: 【科研小白系列】模型训练已经停止(强行中断)了,可GPU不释放显存,如何解决? 每日一言🌼: “生…

k8s网络

pod 网络 在K8S集群里,多个节点上的Pod相互通信,要通过网络插件来完成,比如Calico网络插件。 使用kubeadm初始化K8S集群时,有指定一个参数–pod-network-cidr10.18.0.0/16 它用来定义Pod的网段。 而我们在配置Calico的时候&#…

Trm理论 2(Word2Vec)

神经网络模型(NNLM)和Word2Vec NNLM模型是上次说过的模型,其目的是为了预测下一个词。 softmax(w2tanh(w1x b1)b2) 会得到一个副产品词向量 而Word2Vue就是专门求词向量的模型 softmax(w2*(w1*x b1)b2) Word2Vec softmax(w2*(w1*x b1)b…

jmeter性能测试HTML测试报告生成详解

作用:jmeter支持生成HTML测试报告,方便查看测试计划中获得图表和统计信息 命令: jmeter -n -t [jmx file] -l [result file] -e -o [html report folder] 示例:jmeter -n -t login.jmx -l result.jtl -e -o ./report jmx文件&a…