HTTPS相比HTTP为什么安全
HTTPS(超文本传输协议[安全])
1.HTTPS为什么叫安全的超文本传输协议
在HTTPS中,S是Security的意思,是安全的意思,而HTTP是超文本传输协议,这就不得不谈起HTTP在安全方面有什么劣势或者不足之处.
- HTTP通信是明文通信,通信过程可能会被监听
- 不验证通信对方的身份,有可能遭遇伪装
- 无法验证报文的完整性,或者报文遭到篡改
除此之外,HTTP本身也具备很多缺点,比如性能低下,即使是HTTP1.1,采用管线化(管道化)技术,但是在并发请求处理的情况下,性能依旧不够.
2.通信的加密
HTTP协议中没有加密机制,但是可以通过SSL或者TLS协议组合使用,加密HTTP的通信内容.与SSL组合的HTTP也被称为HTTPS,所以HTTPS并不是应用层的一个协议,而是基于SSL/TLS 和HTTP组合的一种统称.
什么是加密?
- 现在将我们所有的文件都看成由字符构成的二进制文件,其中每个字符都被分配了相应的二进制编码,这也叫字符编码.定义了哪个编码对应的哪个字符,这种编码体系就叫做字符集,例如我们的ASCLL字符集,Unicode字符集,EUC字符集等,例如:现在有一个字符集,由三位字符组成,ABC.
| 字符 | 编码 |
|---|---|
| A | 65 |
| B | 66 |
| C | 67 |
转换成对应的十进制就是65 66 67,在转换成二进制,大家自行转换就行,这样展示出的数据就被称之为明文
如果是你,该如何去设计加密?
- 正常的加密通常需要相对的解密,而这种加密的方式需要符合逻辑,对数据进行加密其实有很多种设计思路,例如,将数据的每个字符对应的十进制+2,就比如ABC进行+2加密之后就会摇身一变CDE,如果还需要解密,即可进行逆加密就能得到原始的加密数据了
- 除此之位,二进制的位运算:异或,对于异或的结果是一个可逆的过程,因为他并不关心运算的结果,这种运算如果应用到二进制种的某一位进行运算之后,或者是某几位,加密的方式全权由自己决定.如果需要解密,只要知道加密的过程即可.
#include <stdio.h>
#include <string.h>
void xor_encrypt_decrypt(char *data, char key) {
size_t length = strlen(data);
for (size_t i = 0; i < length; i++) {
data[i] = data[i] ^ key; // 对每个字符进行异或操作
}
}
int main() {
char plaintext[] = "Hello, world!"; // 待加密的明文数据
char encryption_key = 0xAA; // 加密密钥,可以是任意字符
// 加密
xor_encrypt_decrypt(plaintext, encryption_key);
printf("加密后的数据: %s\n", plaintext);
// 解密(使用同样的密钥进行解密)
xor_encrypt_decrypt(plaintext, encryption_key);
printf("解密后的数据: %s\n", plaintext);
return 0;
}
这几种举例其实都是对称加密算法,因为加密和解密的方式是一样的,这种加密解密的方式我们称之为密钥,更多的是一种实现思想或者算法
然而,我们的HTTPS可不止不于此,他不仅采用了对称加密算法,还采用了非对称加密算法(密钥不同,加密的密钥和解密的密钥不同,因此会有公钥和私钥一说).
因为在互联网中,密钥也有被拿到的风险,这样的加密方式放在传输信息中并不安全,于是通过公钥和私钥的方式进行非对称加密.

公钥是可以公布给全世界,而私钥仅仅只有自身知道,至于互联网中常见的RSA非对称加密算法,本人才学疏浅,无法理解其原理,至于对称加密和非对称加密在HTTPS协议中哪些地方使用,需要了解HTTPS RSA握手过程才能理解.
3.信息摘要(Message Digest)和消息认证码(Message Authentication Code)
他两是什么:验证数据完整性的一把钥匙,不过两者存在一定的区别,我们先来理解信息摘要
信息摘要是:通过哈希函数对数据进行计算得到的固定长度的字符串,通常称为哈希值或摘要值。

- 常见的哈希函数包括MD5、SHA-1、SHA-256等。
- 信息摘要用于验证数据的完整性,即检查数据在传输过程中是否发生了任何更改。
- 信息摘要是单向的,无法从摘要值还原出原始数据。
- 信息摘要广泛应用于文件完整性检查、数字签名等领域
其实很好理解,同一份数据,如果都用相同的哈希函数进行运算,得到的哈希值是相同的,而数据如果不完整或者发生变更,哈希值便会立刻发生改变,至于双方如何知道对方使用的何种哈希函数?
协商或者协议
消息认证码:一种使用密钥对数据进行加密和校验的技术,它使用对称密钥算法,将密钥与数据进行运算生成一个固定长度的认证码

- 常见的消息认证码算法包括HMAC、CMAC、Poly1305等。
- 消息认证码不仅验证数据的完整性,还提供了身份验证和防止篡改的功能。
总结:两者的不同
乍一看,好像两种方式都能保证数据的完整性,只不过使用的方式和最后比对的结果的名称不同罢了,但是,消息认证码使用的是对称密钥进行运算的,这一点非常非常重要,因为对称密钥只有发送方和接收方才知道,其余人并不知道这个对称密钥.所以这就保障了消息认证码还可以确保身份.
但是我猜到应该会有人问对称密钥为什么不会被他人知道?我们前面提及在HTTPS协议中,是使用的混合加密的方式,其实这种加密方式非常巧妙,因为通过对称加密的方式既然有可能被人知道,那就需要通过非对称加密的方式,我们在HTTPS后面的大致过程中了解.
4.数字签名
既然已经有了相应的加密算法进行加密解密,也有了相应的标识去保证数据的完整性和身份的认证,那么为什么还需要数字签名去保证身份的认证???
使用的地方不同,在建立阶段通常需要数字签名去验证服务器的身份,而数据传输过程中则需要去通过消息认证码去验证.
数字签名验证数字证书的完整性和真实性,以确保服务器的身份,而数字证书是由CA机构颁发的,一般服务端需要申请HTTPS服务时,就会去申请所谓的数字证书,数字证书包含着服务端的信息以及对应的公钥.其实理解这一个过程十分不易,需要用图解的形式去了解.

于此,服务端就获得了数字证书,数字证书中包含着公钥和私钥,服务端会根据私钥生成相应的数字签名,而这个数字签名则用来验证数字证书

这就是数字签名的生成过程,其中利用到了信息摘要,这就是为什么要了解信息摘要的原因.至于客户端是如何通过数字签名是验证数字证书的完整性,身份的可靠性,其实也很好理解.

一方面服务端通过数字私钥对信息摘要进行加密运算得到数字签名,而客户端通过公钥对数字签名在反手得到信息摘要,但如果需要比对真正的信息摘要,只需要拿数字证书再进行哈希运算得到这个信息摘要,进行匹配就行,是不是很惊奇,明明两种运算的方式不同,却依然能够获得相同的信息摘要.这下便可以彻底知道数字证书和数字签名的真正关系了
因此,无论是数字证书的公钥被恶意篡改,还是签名被更改,都会导致信息摘要无法匹配,导致身份无法识别,当然这个数字证书的这个过程其实是在建立连接的过程中进行的,在实际的通信交换数据的过程中常常用到消息认证码来确保数据的可靠性.
5.HTTPS的大致过程
当你输入一个HTTPS地址并访问时,以下是大致的步骤和过程:
- 客户端发送HTTPS请求:你的浏览器向服务器发送一个HTTPS请求,请求访问指定的网址(例如https://www.example.com)。
- 服务器证书:服务器接收到请求后,会将自己的数字证书发送给客户端。该证书包含服务器的公钥、证书颁发机构的签名以及其他相关信息。
- 客户端验证证书:浏览器会验证服务器证书的有效性,包括检查证书的合法性、过期时间、证书链的完整性等。如果证书验证失败或存在问题,浏览器会显示警告信息。
- 密钥交换:如果服务器的证书验证通过,客户端会生成一个随机的对称密钥,称为会话密钥。然后,客户端使用服务器的公钥加密该会话密钥,并将其发送给服务器。
- 密钥解密:服务器接收到加密的会话密钥后,使用自己的私钥进行解密,得到原始的会话密钥。
- 安全通信建立:客户端和服务器现在都有了相同的会话密钥,用于加密和解密通信内容。双方可以使用对称密钥进行加密和消息认证码计算,以确保通信的机密性和完整性。
- 数据传输:客户端和服务器使用会话密钥对HTTP请求和响应进行加密和解密。数据在传输过程中使用加密算法进行保护,防止被中间人窃听或篡改。
- 连接关闭:当通信结束时,客户端和服务器可以选择关闭连接。
- 其中的第二步和第三步我们以及在上文讲过了,在客户端验证完数字证书的合法性后,便会实现密钥交换,而这个对称性密钥就是这个时候生成的,也被称为会话密钥,在被进行公钥加密之后,也只有服务端的私钥才能解密,这就保证了为什么对称性密钥一定不会被拿到的缘故,解释了前文的对称性密钥在数据传输可靠的缘故,毕竟进行数据传输的过程中,使用简单的加密解密方式通常都是时间短,效率高的.不得不说,每一种密钥的方式都恰到好处地使用到了.
以上就是HTTPS为什么安全可靠的原因了,如果需要了解TLS/SSL握手的详细内容可以查阅相关资料。
HTTPS相比HTTP为什么安全的更多相关文章
- 打造安全的App!iOS安全系列之 HTTPS
如何打造一个安全的App?这是每一个移动开发者必须面对的问题.在移动App开发领域,开发工程师对于安全方面的考虑普遍比较欠缺,而由于iOS平台的封闭性,遭遇到的安全问题相比于Android来说要少得多 ...
- iOS安全系列之一:HTTPS (轉載)
如何打造一个安全的App?这是每一个移动开发者必须面对的问题.在移动App开发领域,开发工程师对于安全方面的考虑普遍比较欠缺,而由于iOS平台的封闭性,遭遇到的安全问题相比于Android来说要少得多 ...
- HTTPS系列干货(一):HTTPS 原理详解
HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷 ...
- 案例分析——BAT业务https化经历
一.前言 通常的http访问会遭到中间人攻击.网络嗅探等普通用户感知不到的恶意行为,这些行为会篡改用户浏览页面引导用户访问非法网站.抓取用户的上网行为以及个人信息.严重的会造成用户 ...
- iOS安全系列之一:HTTPS
如何打造一个安全的App?这是每一个移动开发者必须面对的问题.在移动App开发领域,开发工程师对于安全方面的考虑普遍比较欠缺,而由于iOS平台的封闭性,遭遇到的安全问题相比于Android来说要少得多 ...
- HTTPS 基本流程 转载 https://zhuanlan.zhihu.com/p/27395037
协议 1.HTTP 协议(HyperText Transfer Protocol,超文本传输协议):是客户端浏览器或其他程序与Web服务器之间的应用层通信协议 . 2.HTTPS 协议(HyperTe ...
- 加密方法与HTTPS 原理详解
一:加密方法: 1,对称加密 AES,3DES,DES等,适合做大量数据或数据文件的加解密. 2,非对称加密 如RSA,Rabin.公钥加密,私钥解密.对大数据量进行加解密时性能较低. 二:https ...
- HTTPS原理,以及加密、解密的原理。
https://blog.csdn.net/Yang_yangyang/article/details/79702583 摘要:本文用图文的形式一步步还原HTTPS的设计过程,进而深入了解原理. A在 ...
- nginx配置https并强制http自动跳转到https
关于使用HTTPS/SSL的必要性,可以自行baidu,援引的说法,EFF(Electronic Frontier Foundation),全球过半流量采用https. https://www.osc ...
- [转帖]HTTPS系列干货(一):HTTPS 原理详解
HTTPS系列干货(一):HTTPS 原理详解 https://tech.upyun.com/article/192/HTTPS%E7%B3%BB%E5%88%97%E5%B9%B2%E8%B4%A7 ...
随机推荐
- 【IntelliJ】添加javaweb、tomcat语法支持
默认情况下:idea不支持javaweb的语法 但,我们的期望是: 解决方法:配置tomcat如下: (假设你已经配置好了tomcat)接下来: 1.打开[项目结构(快捷键:Ctrl + Shift ...
- 【Leetcode】 # 20 有效的括号 Rust Solution About Rust Stack implement
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效.有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合.注意空字符 ...
- SpringBoot之MVC配置(WebMvcConfigurer详解)
一:基本介绍 Spring MVC是一种常用的Java Web框架,它提供了一种基于MVC模式的开发方式,可以方便地实现Web应用程序.在Spring MVC中,WebMvcConfigurer是一种 ...
- React框架学习基础篇-HelloReact-01
一直想掌握一门前端技术,于是想跟着张天宇老师学习,便开始学习React,以此来记录一下我的学习之旅. 学习一门新的技术首先是去官网看看,React官网链接是[https://zh-hans.react ...
- 教你如何用Vue3搭配Spring Framework
摘要:在本文中,我们将介绍如何使用Vue3和Spring Framework进行开发,并创建一个简单的TodoList应用程序. 本文分享自华为云社区<Vue3搭配Spring Framewor ...
- range嵌套range beego前端页面渲染
range嵌套range beego前端页面渲染 问题 listA(name,age...) listB(hobby...) 有多个不同的list 对象,在前端中需要用range渲染,但是多个list ...
- C#.NET Framework 使用BC库(BouncyCastle) RSA 公钥加密 私钥解密 ver:20230706
C#.NET Framework 使用BC库(BouncyCastle) RSA 公钥加密 私钥解密 ver:20230706 环境说明: .NET Framework 4.6 的控制台程序 . 20 ...
- 备份Ubunut已安装的软件包并在新的Ubuntu 系统上恢复
0.查看已安装列表 dpkg -L xxxx.deb 1.备份 安装apt-clone: $sudo apt-get install apt-clone 提供一个保存备份文件的位置.我们在 /back ...
- shell 并发
#!/bin/bash # 设置并发数 thread_num=3 # 创建管道文件 FIFO=/tmp/$$-FIFO mkfifo $FIFO # 使用句柄打开管道文件 exec 1000<& ...
- 面霸的自我修养:JMM与锁的理论
王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是<面霸的自我修养>的第二弹,内容是 Java 并发编程中关于 Java 内存模型(Ja ...