为了账号安全,请及时绑定邮箱和手机立即绑定

如果手机上安装了数据包捕获或任何嗅探器,则阻止 android 应用程序运行

如果手机上安装了数据包捕获或任何嗅探器,则阻止 android 应用程序运行

达令说 2022-10-12 16:06:17
我想让我的 Android 应用程序安全。在某些应用程序中,如果手机安装了网络嗅探器程序(数据包捕获、ssl 捕获等),应用程序会发出警报(删除数据包捕获)并关闭。如何添加类似的安全措施?我应该寻找哪些技术?
查看完整描述

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


查看完整回答
反对 回复 2022-10-12
?
慕标5832272

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))


查看完整回答
反对 回复 2022-10-12
  • 2 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信