http
由于 http 协议本身不具备加密的功能,在进行 数据传输时,它的信息都是以明文方式发送,很容易发生数据泄露,数据篡改,流量劫持,钓鱼攻击等安全问题。
加密算法
- 对称加密:DES,AES
- 非对称加密:RSA
上次去面试被问到我们的数据是用什么加密的?我脑海里只有md5。面试官摇摇头,我知道又凉啦,所以在这里整理了一下关于加密算法的知识。
我们常说的md5,其实是一个不可逆的加密,比如用户的密码,你如果明文传输的话,万一被抓包了,那用户的数据不就泄漏了吗?所以需要给数据加密一下。 可是什么是md5呢,md5属于哈希算法的一种,哈希算法是一种可以将任意长度的输入转化为固定长度输出的算法,md5是一个包含32位的十六进制字符串,区分大小写。 它有以下特点:
1.不可逆,加密完,很难倒着推出来之前的密码。
2.压缩性,不管原来的数据多长,加密完的数据统一长度。
3.抗压性,如果加密后的字符串很接近,并不代表加密前的数据很接近。还有,两个很接近的字符串,加密后差异很大。
从上可以看出md5是安全的,但是最近几年,出现了一个彩虹表的东西,相当于建立了一个庞大的数据库,可以暴力碰撞出来之前的值。为了防止这种情况,又有了一个加盐的操作,其实就是,再生成一个字符串,按照一定规则,把字符串混入md5后的字符里,算是比较安全的操作。
其他的SHA1、HMAC本质上是类似的。
其他的可以加密的算法包含:
对称加密: AES、DES、3DES 、RC4等。这个加密后是可以解密的,可以用于服务器和客户端的数据传递,效率高一些。
非对称加密:RSA、DSA、ECC,效率低一些一般用在https证书校验阶段。
推荐:www.jianshu.com/p/38c93c677…
https
这里讲述了整个流程,我结合自己的理解,做了一个总结。
校验流程:
- client向sever请求,收到证书。
- client用本地内置的公钥去解密签名,校验证书有没有篡改,域名是否一致。如果不是证书机构颁发的,或者是证书与请求的域名不一致,那么校验是不通过的。
- client随机生成一个对称加密的key,返回给server,server把要传输的数据加密,给到client.
- client 收到数据,用key解密。
Charles 是如何抓包https的?
charles扮演中间人的角色,当client发送请求后,它伪装成server,把自己签发的证书发给client,因为抓包前我们手机需要安装charles自己的根证书,所以可以骗过client。从client那里拿到key后,再伪装成client与server通信。
那么如何避免被抓包?
- 第一种思路是:如果我们能判断是否有代理,有代理那么就存在风险,这个方法简单粗暴。
- 第二种:把证书打到包里,然后进行校验。但是这种方式会有两个问题,会让app请求慢一些,还有就是证书会过期,需要更换的问题。
更新
iOS 中对 HTTPS 证书链的验证详细地讲述了证书链,锚点的概念。