目录
[session id](#session id)
https
这里对https的介绍更偏向于数据安全的方面
以及,明确http协议是明文传输协议
引入
用户输入的数据会随着http请求/响应在两台主机中传递
下面是一个精简的osi模型:
- 虽然目标主机确实能收到数据,但传输过程中也会有其他主机可以收到,这样就会涉及数据泄漏的问题
- 并且,因为这里画出来的下三层是在os里的,os并不会对数据做加密处理,它只管传过去
所以,我们需要在应用层添加一层软件层,给数据套个壳子 -- 加密解密层
介绍
当然,不止一台主机上有,目标主机上也得有:
这样数据经过本主机的加密,经过目标主机的解密,可以实现:
- 传输过程中是加密数据
- 目标主机最终得到的是有效数据
而http + 加密解密层 = https
- 所以,https其实就是http的安全版本,它在http的基础上添加了安全性和加密
加密解密层
介绍
- 一般是使用现成的方案ssl
- 当然也可以自定义,但这样维护的工作就得自己来做
没有绝对的安全
其实,无论是什么协议,都不是百分百安全的
- 随着算力的提升,攻击者可能会找到新的方法来破解加密算法或者利用系统的漏洞
- 所以,这些协议需要不断更新迭代
我们可以把 攻破成本>攻破后的收益 的网络协议称为是相对安全的
使用ssl的弊端
因为ssl过于权威,使用的人多,去试图攻破它的人也多,过一段时间ssl就会暴露出一些问题,就迫使ssl推出新版本
所以,如果使用的是旧版本的ssl,很可能就直接被攻破了
加密解密
概念
加密
将原始数据(称为明文)转换为经过特定算法处理的密文的过程
- 在加密过程中,使用密钥来控制算法的行为,以确保生成的密文具有一定的安全性
- 即只有持有正确密钥的人才能解密并访问原始数据
解密
将密文转换回原始的明文的过程
- 解密过程需要正确的密钥,以便算法能够逆向处理密文并还原出原始数据
秘钥
在加密解密过程中起关键作用的参数,用于控制加密算法的行为
- 也叫做 明文<->密文 的中间数据
- 密钥可以是对称密钥或非对称密钥(在下面的加密方式中会介绍)
举例
我们用具体例子来说明这些概念
现实中
比如说在综艺极限挑战里,男人帮曾经就做过解密:
- 把所听内容写在信纸上,然后根据另一张画了框框的纸,找到要传递的信息
- 明文 -- 实际想要传递的信息
- 密文 -- 信纸上所写内容
- 秘钥 -- 一张画了框的纸(和扣了洞的纸作用一样)
网络中
我们假设要传递的数据都是数字,然后我们对它进行异或,在另一端再通过异或拿到有效数据
- 明文 -- 3
- 密文 -- 3^5
- 秘钥 -- ^5(这个秘钥就属于等会介绍的对称密钥)
说了这么多,我们到底为什么要进行加密呢?
加密的必要性
所有的数据包都会经过运营商的网络设备
- 因为我们使用的网络都是运营商提供的(移动,联通,电信等等)
如果使用的是http协议,那运营商很轻易地就能得到我们的请求和响应内容,并且做出修改
- 比如:当我们下载某软件时,会向服务器发送http请求,然后服务器返回下载链接
- 当运营商拿到响应时(也叫做劫持),可以篡改下载链接,然后将篡改后的响应返回给客户端
- 如下图:
- 这样就无法保证我们拿到的链接是安全的,很可能被恶意篡改
不止运营商能拿到,传输过程中经过的每一个设备都可以拿到
- 比如路由器
甚至,如果连接了免费wifi,其他人的设备就可以获取到你的请求信息
- 如果这个网络是钓鱼网络,而你的网络行为都需要经过这个设备,那么你的数据就被泄露了
如果手机开了热点,然后电脑连接这个网络
你的手机也就可以获取到电脑的请求数据(只是提一嘴哈)
以上都体现出数据加密的必要性试想一下,如果支付宝等支付软件使用的是http协议
那就很容易可以获取到用户的登录信息,甚至支付密码,进而转走里面的钱
常见加密方式
对称加密
加密和解密使用的秘钥是同一个
特点
- 加密速度快,效率高
非对称加密
加密和解密过程中使用的秘钥不同
- 并且,这两个秘钥是相互对应的,也就是加密解密过程是可逆的
- 用A加密,就用B解密 ; 如果用B加密,就用A解密
一般把其中一个秘钥公开
- 当然一个公开了,另一个是绝对不能公开的
- 我们把公开的秘钥叫做公钥 ,未公开的秘钥叫做私钥
- 这种方式可以保证 -- 如果用公钥加密,就只有拥有私钥的人/组织才能解密
特点
相比对称加密,计算量大,速度较慢
数字摘要/指纹
介绍
利用hash算法处理数据,生成固定长度 的数字摘要,具有唯一性
- 很小很小的概率会发生冲突
它并不用来加密,而是用来判断数据是否被篡改
- 它只能实现从左到右的过程(也就是加密),但不可逆(也就是无法解密),所以并不属于加密手段
- 只要数据有一点点不同(哪怕只是一个符号),生成的数字摘要就有明显差异
- 是不是就和指纹识别类似,只要有一点不同,就不是同一个人
最典型的算法
- MD5
应用
session id
一个网站是不允许它存储的用户信息里有完全相同的数据的(用户名和密码),不然他们不就是同一个人了吗
- 所以,服务器内部存放的用户数据都是不同的
- 那么,经过md5运算后的字符串一定是不一样的
- 所以我们可以把这串字符串作为set-cookie的填充数据返回给客户端
- 然后客户端可以拿着这个字符串在服务器中进行信息匹配(因为它具有唯一性),并且可以保证数据的私密性(相当于经过了加密,并且只有在服务器内部才能解密)
是不是很熟悉,其实这串字符串就是session id
- session id就相当于是客户端访问服务器时的指纹信息
百度网盘的秒传功能
如果多个用户上传同样的资源,服务器会把这份资源存储多份吗?
- 不会的
- 存储多份一样的资源完全是浪费空间
所以,一般会在上传前先将资源转换成数字摘要,然后上传到服务器进行匹配
- 如果内部匹配到了,意味着上传的文件与已存在的文件内容完全相同,就直接返回已有资源的软链接即可(这也就达到了秒传的效果)
- 如果匹配不上,则说明内部没有该文件,这时再进行上传流程就好了
在某些场景下,摘要也是需要加密的,加密后就得到了数字签名