前言
https协议是建立上ssl协议之上的,Secure Sockets Layer简称SSL。
SSL协议是什么?
ssl是一套协议,它工作在TCP传输层和应用层之间的协议,它通过一系列的加密算法 和第三方权威CA机构颁发证书的方式让我们的数据在互联网上传输的过程中不被别人篡改。如果被篡改,我们能轻松发现并拒收
对称加密、非对称加密、摘要是什么?
对称加密算法(base64)
使用秘钥A 对数据进行加密 使用秘钥A 解密数据,使用同样的秘钥对数据加解密。
import base64 s = "你好" bs = base64.b64encode(s.encode("utf-8"))#base64 加密 print( bs) bbs = str(base64.b64decode(bs), "utf-8")#base64 解密 print(bbs)
非对称加密算法(ssh免密码登录)
Client、Server 端都有1套 公钥和私钥
使用Client的私钥对数据进行加密,Server端收到数据使用Client端的公钥进行解密
使用Server的私钥对数据进行加密,Client端收到数据使用Server端的公钥进行解密
简单来说就是私钥加密公钥解密,但是公钥是由于私钥生成的。公钥只能解密特定私钥的数据。
摘要(用户密码加密后存到数据库、下载的源码包需要校验文件md5值)
对同一数据进行 md5/sha...不可逆算法 加密数据得到固定产长度的密文,比较加密2次后 密文的结果是否一致;摘要的主要功能就是用于身份/数据校验的
SSL协议数据加密过程
安全的角度
为了在数据传输的过程中被中间人拦截,我们选择了可信、权威的第三方认证机构帮助我们做公钥认证 以下简称CA。
1.Sever端提交公钥到CA由CA拿着自己的私钥对Server的公钥进行加密。(得到结果是密文公钥)这个过程也就是运维人员常说的签名
2.本地浏览器内置了CA的公钥,使用浏览器内置的CA公钥对Server的公钥进行解密(得到server明文公钥)
3.使用Server的公钥,对Server端私钥加密的数据 进行秘密
黑客的角度
浏览器本地可以内置CA的公钥黑客也可以;
如果黑客在中间打劫了数据,黑客也用CA的公钥解密出了Server的公钥,然后再用server的公钥解密出数据。我就能看client和Server端传输的数据了。
因为黑客中间拦截、打开了数据,因为黑客没有CA的秘钥无法对Server的公钥 再次进行加密。
即使黑客 篡改数据 我们能轻松发现并拒收
因为你的浏览器信任了Charles(中间人的CA证书)
你的浏览器 信任了非CA颁发的证书就意味着,黑客中间截获数据之后,黑客使用自己的私钥对Server的公钥进行加密,但是Client信任了黑客的证书。
所以中间人就成功窃取了https包。看来https也不是万无一失的。
HTTPS通信过程
前提:Server端已经向CA机构申请了 1的一套 权威的公钥和私钥
1.客户端访问服务端的443端口告诉服务端自己支持的加密算法(RSA)
2.服务端把公钥放在证书里发送给客户端,私钥自己保存
3.客户端首先向一个权威的服务器检查证书的合法性,如果证书合法,客户端产一段随机数,这个随机数就作为通信的会话密钥,我们称之为对称密钥,用公钥加密这段机数,然后发送到服务器
4.服务器用密钥解密获取对称密钥,然后双方就已使用对称密钥进行加密解密通信了(对称加密的过程)
问题:Client端 和Server端如何在不设置固定数据的情况下,它们之间 每1次会话 双方都产生1个新的且相同的会话秘钥。
也就是说如何在双方没有任何约定的前提下, 相互抛个媚眼/做任何动作,对方都相互明白对方的意思?
''' 1、首先Alice保存自己的私钥a(随机数),Bob也保存自己的私钥b(随机数) 2、Alice计算 A = g^a mod p,并将g,p,A发给Bob 3、Bob计算 B = g^b mod p,然后将g,p,B发给Alice 4、Alice得到对称密钥K = B^a mod p = (g^b mod p)^a mod p = g^ab mod p 5、Bob同样得到对称密钥K = A^b mod p = (g^a mod p)^b mod p = g^ab mod p ''' a,b=(5,11) #a、b2个数字,由server端和client端 每次随机生成 g=5 p=10000379#大素数10000657 10000667 10000379 https://www.haomeili.net/ZhiShu/big A=g**a%p B=g**b%p #Alice 设置随机数a,得到同一个秘钥 print(B**a%p) print((g**a%p)**b%p) #Bob设置随机数b 得到同一个秘钥密钥K print(A**b%p) print( (g**b%p)**a%p)
有了Diffie-Hellman秘钥交换算法就意味着 每1次client和server端传输数据,使得都是1个新的会话秘钥!
由于client和server端每次都使用1个随机数字, 一般的黑客很难计算出当前的会话、及下一次秘钥 会是什么?