[英]Prevent the android app from running if packet capture or any sniffer is installed on the phone
在安裝網絡嗅探器時禁用它不會使您的應用程序更安全。 作為一個用戶,我會對這種無效的所謂安全措施感到非常惱火。
為了保護您的應用程序,您應該考慮攻擊者會做什么。 假設您擔心網絡流量分析,請注意存在主動攻擊和被動攻擊。
包括網絡嗅探、網絡監聽等,攻擊者可以使用Android手機本身的VPNService ,無需root即可監聽所有流量。 當然,您可以嘗試根據已安裝的應用程序檢測並阻止它,但攻擊者將繼續前進並設置外部捕獲。 他們可以在筆記本電腦上設置一個接入點並將手機連接到它,然后從筆記本電腦運行網絡捕獲。
要正確保護您免受此類攻擊者的侵害,請確保您的通信已加密(使用 HTTPS/TLS)。 那么不管某人是否能夠在電話或本地網絡上記錄網絡流量,他們將只能看到目標 IP 地址和主機名,而不能看到實際的請求詳細信息(URL、cookie 等)
包括中間人 (MitM)、SSL/TLS 代理等。控制網絡的攻擊者可以攔截連接並嘗試偽裝成服務器。 如果流量沒有使用 TLS 保護,這是微不足道的。 盡管即使您實施了 TLS,您仍然必須驗證服務器提供的證書。 TLS 代理無法顯示由受信任的 CA 簽名的有效證書,因此通常這沒問題。
然而,用戶可以將他們自己的 CA 添加到設備,這將允許他們再次讀取未加密的應用程序流量。 為了防止這種情況,您可以考慮證書固定。 這樣,您就可以在應用程序中對受信任的證書進行硬編碼,而用戶無法以通常的方式覆蓋它。
最后請注意,堅定的攻擊者還可以修補(修改)您的 apk,將其安裝在模擬器中,或嘗試對其進行反編譯。 他們還可以從中學習如何與服務器通信。 在開發服務器時請牢記這種情況。
https://developer.android.com/training/articles/security-ssl
我使用 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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.