在我们的日常工作中,经常涉及抓包软件,mac常用的就是charles了。但只会使用,却不了解其中的原理~
一.正向代理&反向代理
    正向代理与反向代理,是常用的代理技术。
-
正向代理(forward proxy):
是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。类似于租房,有时候我们根本找不到个人房源,只能通过中介去看房子,这时候,其实房东根本不知道谁来看了他的房子,他只知道中介在联系他。这里面,租客就是用户,中介是代理服务器,房东就是目标服务器。
-
反向代理(reverse proxy):
是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。同样是租房,有时候和我们联系的可能是房东的朋友、甚至二房东,但是我们并不知道拿着钥匙进出自由的这个人并不是真正的房东,这里的二房东就相当于反向代理服务器。
     所以,正向代理,是“代理服务器”代理了“客户端”,去和“目标服务器”交互;反向代理,是“代理服务器”代理了“目标服务器”去和“客户端”进行交互。
二.http与https
     我们抓包里既包含http,又包含https。那么他们到底什么区别呢?
1.http
     HTTP是HyperText Transfer Protocol的缩写,中文翻译为超文本传输协议。说的简单点,其实HTTP协议主要就是用来进行客户端和服务器之间进行通信的标准协议。当我们在浏览器中输入一个url,如www.baidu.com ,然后按下回车,一直到页面显示百度的首页的过程就是一次HTTP的网络通信。这次通信过程中,电脑就是客户端,而搭建百度服务的那些计算机机器就是服务器。这个过程类似于老板通过电话给员工下达命令:
- 建立连接:老板拨通手下员工的电话
- 请求(request):老板提出自己的要求
- 响应(response):员工应答老板的请求
- 关闭连接:挂断电话
     老板的要求各种各样,可能是定个飞机票,改个文案等等,同样的,http的请求方法也有很多,比如get,post,head等;
     对应的,员工响应老板飞机票定好了,文案改到第八百版,实在要了血命改不动了,那么http的响应通常以状态码开头,常见的状态码如:200、302、404、500等
状态码 | 描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
     但是http有个非常可怕的特点,他传输的内容都是明文的
     比如你喜欢一个妹子不好意思张口,让兄弟帮忙传话。
-
你-->兄弟:帮我告诉她,我喜欢她
-
兄弟→妹子:我哥们说你长的丑
-
妹子→兄弟:让他滚
-
兄弟-->你:妹子说不喜欢你
     好气哦,保持微笑。
     而https正是要解决这个问题,在http传输层之上加了一个安全层(SSL/TLS)
2.https
     都说https是安全的,接下来,我们层层递进,看看他为什么是安全的,怎么做到安全。
     保证安全,我们自然而然的想到加密,加密又分为对称加密和非对称加密。我们先来说一说这两者的区别
2.1对称加密
     加密和解密用的密钥是相同的
2.2非对称加密
     非对称加密中存在两个密钥。公钥:对外公开,私钥:私密的自己保留。使用一个密钥来加密,可以用另一个密钥来解密
2.3加密严密性的发展
(一)对称加密
     小丸子和花轮想要聊点悄悄话,俩人约定用一种对称加密算法。用同一个密钥进行加密和解密
- 小丸子:我们聊天吧
- 花轮:好啊,我们用对称加密算法,密钥是key1
- 小丸子:sdf65&*..tyet (用key1加密后)
- 花轮收到后,用key1解密,收到小丸子的会话“今晚八点,老地方见!”
     这个时候,美环出现了,暗恋花轮已久的美环,劫持了花轮的密钥key1,并发送给小丸子另一个密钥key2。小丸子误以为key2是花轮传过来的,把悄悄话用key2加密后传回。美环用key2解密后得到明文消息,又将篡改后的消息以key1加密传给花轮。花轮解密后收到“小丸子”的会话“不想和你做朋友了”,一脸懵圈。美环坐收渔翁之利。显然,这是很危险的行为
(二)非对称加密
     在被美环劫持之后,俩人想,不能就这么被干扰。因此我们尝试使用非对称加密,非对称加密的一组密钥对中,包含一个公钥和一个私钥。明文既可以用公钥加密,私钥解密;也可以用私钥加密,公钥解密。比如小丸子生成一个“公钥-私钥”对,叫做“小丸子公钥-小丸子私钥”,花轮也生成一对,叫“花轮公钥-花轮私钥”。使用私钥加密的信息,只能由该私钥对应的公钥才能解密。使用公钥加密的信息,只能由该公钥对应的私钥才能解密
- 小丸子:我们聊天吧
- 花轮:好啊,我们用非对称加密算法,这是我的公钥key1
- 小丸子将自己的信息用key1加密后传回给花轮
- 花轮用自己的私钥进行解密,查看具体信息数据
- 这时就算美环劫持了公钥key1,因为他没有掌握对应的私钥,所以也没有用了
     但是,美环虽然不知道花轮的私钥,但是在截获了花轮的公钥key1之后,却可以自己生成另一对“美环公钥-美环私钥”。美环把自己的公钥key3发给小丸子,小丸子不知道公钥被偷换过,以为key3就是花轮的。于是用key3加密了自己的key2发给花轮,消息再次被美环截获,她用私钥解开了key3的加密,获得key2。这样一来,两人后续的通信即便用了key2做对称加密,也无济于事
为了解决这个问题,请出了老师。。。颁发个证书吧!
我们就来讲讲这个证书吧。证书是由权威的证书颁发机构(CA)颁发的。证书包含的信息见上图,为了便于说明,这里做了简化,只列出了证书的一部分关键信息
首先,收到服务端的公钥后,通过机构的私钥对其加密;再有,同样通过机构私钥,对证书签名进行了加密,签名中包含服务器的网址
并且,权威机构的公钥不需要传输,因为权威机构会和主流的浏览器或操作系统合作,将他们的公钥内置在浏览器或操作系统环境中
那么,当小丸子收到花轮的证书,先从证书里找到权威机构的信息,并从本地环境中找到权威机构的公钥,就能正确解密出花轮的公钥(服务端公钥)
除此之外,通过计算证书签名方法自己算出一个签名,跟证书里的签名对比,一致,通过校验啦!!
试想一下,如果美环劫持了证书,权威机构的公钥也不是什么秘密,美环顺利的通过权威机构的公钥解开得到了花轮的公钥,以及签名
然后呢,她就想把花轮的网址改成她自己的啊,再然后,她需要用机构私钥把修改后的签名加密呀,显然,她并没有机构私钥,无法实施篡改
就算强行篡改,用自己的私钥对签名加密了,小丸子收到后,也没法通过机构公钥解密啦~~此路,美环行不通。。。。。
再换种思路,美环也可以向权威机构申请一份证书,劫持花轮的证书后,把自己的这个证书发出去,小丸子收到后可以用权威机构的公钥解密
巴特,解密后,小丸子就会发现,签名里的服务端网址,并不是她诉求的花轮同学啊,美环无法监听,输了,全剧终。
三.charles代理原理
了解了代理以及加密的原理后,不难发现,charles其实就相当于中间人美环的角色,但之所以美环不行,charles行,是因为客户端(小丸子)提前安装信任了charles自己的证书
因此切记切记!!不要随便安装来路不明的证书!!!!!!
四.结尾的一些话
1.charles的本质就是劫持。但是之所以能够劫持,并不是因为https不安全,而是因为操作人主动安装信任了charles证书
2.在非对称加密里,有时候公钥负责加密,私钥解密,有时候反过来,有点凌乱。
只要想着:当要加密的时候,肯定不希望别人知道消息,所以只有我才能解密,因此公钥加密,私钥解密
当签名的时候,肯定不希望有人冒充,只有我才能发布签名,所以私钥加密,公钥解密
3.在学习私钥和公钥的时候,想了好久,后来结合实际觉得有点类似于邮箱,所有人都可以往邮箱投信件(公钥);但只有邮递员可以打开邮箱(私钥)
要想使用非对称加密算法,首先要有一对key,一个被称为私钥,一个称为公钥。然后可以把你的公钥发给“想给你传密文的用户”,然后用户使用该公钥加密过的密文,只有使用你的私钥才能解密。也就是说,只要你自己保存好你的私钥,就能确保,别人想给你发的密文不被破解。正因为这种加密是单向的,所以被称为非对称加密算法