发布时间:2020-7-2 分类: 行业资讯
首先,HTTPS连接过程和中间人攻击原理
https协议是http + ssl协议,如下图所示:连接过程:
1.https请求
客户端向服务器发送https请求;
2.生成公钥和私钥
服务器收到请求后,会生成公钥和私钥。公钥相当于一个锁,私钥相当于一个密钥,只有私钥才能打开公钥锁定的内容;
3.返回公钥
服务器将公钥(证书)返回给客户端。公钥包含大量信息,如证书的颁发机构,到期时间等;
4.客户端验证公钥
在收到公钥后,客户端将首先验证它是否有效,例如发布机构或到期时间。如果发现错误,将抛出异常,表明证书存在问题。如果没有问题,则生成随机值作为客户端密钥,然后使用服务器的公钥进行加密;
5.发送客户端密钥
客户端使用服务器的公钥加密密钥并将其发送到服务器。
6.服务器接收密钥并对称加密内容
服务器接收加密密钥,使用私钥对其进行解密,并获取客户端密钥。然后,服务器对称地加密要传输的内容和客户端的密钥,这样除非密钥已知,否则服务器无法知道。转移的内容。
7.加密传输
服务器将加密的内容发送到客户端。
8.获取加密内容,解密
在客户端获得加密内容之后,它使用先前生成的密钥对其进行解密以获得内容。
中间人劫持攻击
Https也不是绝对安全的。下图显示了中间人劫持攻击。中间人可以获得客户端和服务器之间的所有通信内容。
HTTPS连接过程和中间人攻击劫持
中间人拦截客户端发送给服务器的请求,然后假装客户端与服务器通信;由服务器返回给客户端的内容被发送到客户端,假装服务器与客户端通信。
这样,可以获得客户端和服务器之间的所有通信内容。
使用中间人攻击,客户端必须信任经纪人的证书。如果客户端不信任,则攻击无效。
第二,预防中间人攻击
劫持中间人的原因是没有验证或验证服务器证书和域名。为方便起见,https请求直接由开源框架的默认身份验证方法采用。
如凌空
HTTPS连接过程和中间人攻击劫持
HTTPS连接过程和中间人攻击劫持
OKhttp3.0
HTTPS连接过程和中间人攻击劫持
预防方法:
有两种方法可以阻止它
1.对于具有高安全性要求的应用程序,您可以使用客户端的嵌入式证书来锁定证书。只有当客户端证书和服务器的证书相同时,才允许通信,例如某些银行应用程序,但此方法面临问题,证书过期,因为证书具有一定的有效期,当嵌入式证书过期时,它可以只能通过强制更新或要求用户下载证书来解决。
以凌空为例:验证的实施如下:
使用预嵌入证书创建SSLSocketFactory;
私有静态SSLSocketFactory buildSSLSocketFactory(Context context,
Int certRawResId){
KeyStore keyStore=null;
试试{
keyStore=buildKeyStore(context,certRawResId);
} catch(KeyStoreException e){
e.printStackTrace();
} catch(CertificateException e){
e.printStackTrace();
} catch(NoSuchAlgorithmException e){
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
}
String tmfAlgorithm=TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf=null;
试试{
Tmf=TrustManagerFactory.getInstance(tmfAlgorithm);
Tmf.init(用于keyStore);
} catch(NoSuchAlgorithmException e){
e.printStackTrace();
} catch(KeyStoreException e){
e.printStackTrace();
}
SSLContext sslContext=null;
试试{
sslContext=SSLContext.getInstance('TLS');
} catch(NoSuchAlgorithmException e){
e.printStackTrace();
}
试试{
sslContext.init(null,tmf.getTrustManagers(),null);
} catch(KeyManagementException e){
e.printStackTrace();
}
返回sslContext.getSocketFactory();
通过ssl校验和和域名验证生成连接
HTTPS连接过程和中间人攻击劫持
HTTPS连接过程和中间人攻击劫持
2对于通用应用程序的安全性要求,您可以使用验证域名,证书有效性,证书密钥信息和证书链的方法
在volley的情况下,重写HTTPSTrustManager中的checkServerTrusted方法并启用强域名验证
。三,Webview HTTPS安全性
目前,许多应用程序使用webview加载H5页面。如果服务器使用由受信任CA颁发的证书,则webViewClient的onReceivedSslError()将在webView.setWebViewClient(webviewClient)中被覆盖。如果发生证书错误,则直接调用handler.proceed。将忽略错误并继续加载带有问题页面的证书,如果调用handler.cancel()可以终止有问题的页面加载证书,证书有问题,可以提示用户冒险,让用户选择是否加载,如果需要安全级别更高,可以直接终止页面加载,提示用户冒网络环境风险:
HTTPS连接过程和中间人攻击劫持
建议不要直接使用handler.proceed()。如果webview在加载https时需要强烈验证服务器证书,则可以使用HttpsURLConnection验证服务器证书以验证onPageStarted()中的证书。如果验证没有停止加载网页。当然,这会降低网页的加载速度,需要进一步优化。具体的优化方法不在本讨论范围内,此处不再详述。