2 回答
TA贡献1802条经验 获得超10个赞
在安装网络嗅探器时禁用它不会使您的应用程序更安全。作为用户,我会对这种无效的所谓安全措施感到非常恼火。
为了保护您的应用程序,您应该考虑攻击者会做什么。假设您担心网络流量分析,请注意有主动和被动攻击。
被动攻击
包括网络嗅探、网络监控等。攻击者可以在安卓手机本身使用VPNService监控所有流量,无需root。当然,您可以尝试根据已安装的应用程序检测并阻止它,但是攻击者将继续前进并设置外部捕获。他们可以在他们的笔记本电脑上设置一个接入点,并将手机连接到它,然后从笔记本电脑上运行网络捕获。
要正确保护您免受此类攻击者的侵害,请确保您的通信已加密(使用 HTTPS/TLS)。那么无论某人是否能够在电话或本地网络上记录网络流量,他们将只能看到目标 IP 地址和主机名,而不能看到实际的请求详细信息(URL、cookie 等)
主动攻击
包括中间人(MitM)、SSL/TLS代理等。控制网络的攻击者可以拦截连接并试图伪装成服务器。如果流量没有使用 TLS 保护,这很简单。即使您确实实施了 TLS,您仍然必须验证服务器提供的证书。TLS 代理将无法显示由受信任的 CA 签名的有效证书,因此通常这很好。
然而,用户可以将他们自己的 CA 添加到设备中,这将允许他们再次读取未加密的应用程序流量。为了防止这种情况,您可以考虑证书固定。这样,您在应用程序中硬编码受信任的证书,而用户无法以通常的方式覆盖它。
最后请注意,坚定的攻击者还可以修补(修改)您的 apk,将其安装在模拟器中,或尝试反编译它。从中他们还可以学习如何与服务器通信。在开发服务器时请记住这种情况。
进一步阅读
https://developer.android.com/training/articles/security-ssl
TA贡献1966条经验 获得超4个赞
我使用 ConnectivityManager 来检测 VPN 服务是否启用。使用它我停止调用 api 调用。
要检测 VPN 是否启用:
fun isVPNEnabled(): Boolean {
val connectivityManager = mContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
val network = connectivityManager.activeNetwork
val capabilities = connectivityManager.getNetworkCapabilities(network)
capabilities!= null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
} else {
connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_VPN)!!.isConnectedOrConnecting
}
}
如果启用了 VPN,则使用拦截器停止 api 调用:
class VPNInterceptor(val context: Context) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val codeSnippet = CodeSnippet(context)
return if (codeSnippet.isVPNEnabled()) {
Timber.d("====>VPN Status : true")
val errorResponse = ErrorResponse("Please turn-off VPN service for security reason.", true)
Response.Builder()
.code(Constants.InternalHttpCode.VPN_CODE) // Whatever code
.body(ResponseBody.create(null, "")) // Whatever body
.protocol(Protocol.HTTP_2)
.message(errorResponse.moshiObjToString(ErrorResponse::class.java))
.request(chain.request())
.build()
} else {
Timber.d("====>VPN Status : false")
chain.proceed(chain.request())
}
}
}
val httpClient: OkHttpClient.Builder = OkHttpClient.Builder()
httpClient.connectTimeout(2, TimeUnit.MINUTES) //Connection time out set limit
httpClient.readTimeout(2, TimeUnit.MINUTES) //Connection read time out set limit
httpClient.addInterceptor(VPNInterceptor(context))
添加回答
举报