http 是明文传输的,被攻击者截获以后会出现一些问题。客户端可能访问的是一个攻击者的服务端(被劫持),导致客户数据泄漏。服务端接收的是一个攻击者的客户端,可能导致带宽损失、数据被修改等等。对于安全级别比较高的应用仅仅的http 已经不在适用了。
解决办法是加密:通信加密(使用ssl 或者tls),内容加密(http 报文加密)。
与ssl 组合的http 称为https。本文介绍一些https 的知识(https 如何做到安全的),以及https 在Android 端的使用。
加密技术使https 安全
介绍两种常见的密码学中的加密技术。
对称加密
加解密使用同一个密钥。优点:速度比较快(相对非对称加密)。缺点:没有办法安全的传输密钥。
非对称加密
使用公钥加密,然后使用私钥解密。优点:公钥是直接公开,而私钥不需要传输,安全。缺点:无法验证公钥的正确性。
证书认证机构(CA)
为了解决非对称加密无法验证公钥的正确性的问题,会使用第三方权威机构来认证公钥的正确性。流程如下:
- 服务器运营人员用‘服务器公钥’向CA请求证书。
- CA用私钥对‘服务器公钥’加密得到‘证书’,然后给服务器运营人员颁布‘证书’。
- 客户端请求服务器时会使用CA公钥对‘证书’校验(这里可以验证’证书’的前提是CA公钥是正确的,CA公钥一般随着浏览器的发布植入到浏览器,安全)获取‘服务器公钥’。
- 后续使用‘服务器公钥’对数据加密,服务器使用‘服务器私钥’进行解密。
https 使用非对称加密来传递通信使用的密钥,使用对称加密来通信。流程如下:
- 客户端使用‘服务器公钥’(通过CA 认证)加密‘对称加密的密钥’给服务器。
- 服务器使用‘服务器私钥’解密得到‘对称加密的密钥’
- 后续使用‘对称加密的密钥’来通信
总结:使用CA 认证证书来保证‘服务器公钥’的正确性,使用非对称加密传递对称加密的密钥来保证对称加密的安全(数据传输的安全)。
抓包分析
tcp 三次握手
ssl 握手
ssl 握手的过程主要分为两部分:获取服务端证书和传递随机生成的密钥用来后续加密通信。
上面三个图是获取服务端证书的过程。流程如下:
- 客户端Client Hello
- 服务端Server Hello,Certificate,Server Key Exchange,Server Hello Done
总结:相当于是客户端通过Client Hello 告诉服务端即将进行ssl 通信,服务端验证能够进行ssl 通信,返回Server Hello 给客户端。然后将证书发送给客户端,最终发送Server Hello Done 代表第一个过程结束。这个过程的安全是通过CA,所以是安全的。
上面是传递随机密钥的过程。流程如下:
- 客户端发送Client Key Exchange 来传递即将用来通信的密钥(该密钥被上面第一个步骤的服务器公钥加密,被称为Pre-master secret)。随后传递Change Cipher Spec 和Encrypted Handshake Message 来告诉服务器即将使用Pre-master secret 来加密。
- 服务端回复Change Cipher Spec 和Encrypted Handshake Message 可以使用Pre-master secret 加密来通信了。(这里的Session Ticket 不了解,但是不影响后面的分析)
总结: 通过服务端的公钥,安全的传递通信使用密钥。
通信
最下面代表的是客户端发送给服务端的一个报文,数据是加密的。
tcp 四次分手
这里没有抓到报文就不展开了,一般需要在通信结束以后过一会儿才能抓到FIN 报文。
总结
整个过程没有明文传递任何客户端和服务端的数据,所以是安全的。
图解http中https 通信流程:
app 如何避免被抓包
大部分app 的数据非常简单就被客户端Fiddler 或者charles。Fiddler 或者charles 代理的原理相当于是一个中间人的身份。客户端访问charles,把charles 当成服务端。charles 再访问最终服务器,服务器当charles 为客户端。
目前分析到的Android 端两种比较方便的方法(后面会写代码实现下):使用https 或者Android 端判断有没有连接代理。
Android 访问https 的方法
下面代码用来访问一个自签名的网站,主要是3个实现:trustNothing 无法访问Trust anchor for certification path not found.
。trustAll 信任所有证书,可以访问,并且可以被抓包。trustOnly 信任唯一证书,无法被charles 抓包。还有一个实现isWifiProxy 可以用来判断有没有使用代理,控制是否请求数据。
|
|
相关工具
tPacketcapture.apk 以及wireshark