最专业的八方代购网站源码!

资讯热点
HTTPS连接过程和中间人攻击劫持

发布时间: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()中的证书。如果验证没有停止加载网页。当然,这会降低网页的加载速度,需要进一步优化。具体的优化方法不在本讨论范围内,此处不再详述。

« 摇动声音以便携带物品的必要因素是什么? | 如何设计一个好的[扫描码]界面? »