2 回答

TA貢獻(xiàn)1802條經(jīng)驗 獲得超10個贊
在安裝網(wǎng)絡(luò)嗅探器時禁用它不會使您的應(yīng)用程序更安全。作為用戶,我會對這種無效的所謂安全措施感到非常惱火。
為了保護(hù)您的應(yīng)用程序,您應(yīng)該考慮攻擊者會做什么。假設(shè)您擔(dān)心網(wǎng)絡(luò)流量分析,請注意有主動和被動攻擊。
被動攻擊
包括網(wǎng)絡(luò)嗅探、網(wǎng)絡(luò)監(jiān)控等。攻擊者可以在安卓手機(jī)本身使用VPNService監(jiān)控所有流量,無需root。當(dāng)然,您可以嘗試根據(jù)已安裝的應(yīng)用程序檢測并阻止它,但是攻擊者將繼續(xù)前進(jìn)并設(shè)置外部捕獲。他們可以在他們的筆記本電腦上設(shè)置一個接入點,并將手機(jī)連接到它,然后從筆記本電腦上運行網(wǎng)絡(luò)捕獲。
要正確保護(hù)您免受此類攻擊者的侵害,請確保您的通信已加密(使用 HTTPS/TLS)。那么無論某人是否能夠在電話或本地網(wǎng)絡(luò)上記錄網(wǎng)絡(luò)流量,他們將只能看到目標(biāo) IP 地址和主機(jī)名,而不能看到實際的請求詳細(xì)信息(URL、cookie 等)
主動攻擊
包括中間人(MitM)、SSL/TLS代理等。控制網(wǎng)絡(luò)的攻擊者可以攔截連接并試圖偽裝成服務(wù)器。如果流量沒有使用 TLS 保護(hù),這很簡單。即使您確實實施了 TLS,您仍然必須驗證服務(wù)器提供的證書。TLS 代理將無法顯示由受信任的 CA 簽名的有效證書,因此通常這很好。
然而,用戶可以將他們自己的 CA 添加到設(shè)備中,這將允許他們再次讀取未加密的應(yīng)用程序流量。為了防止這種情況,您可以考慮證書固定。這樣,您在應(yīng)用程序中硬編碼受信任的證書,而用戶無法以通常的方式覆蓋它。
最后請注意,堅定的攻擊者還可以修補(bǔ)(修改)您的 apk,將其安裝在模擬器中,或嘗試反編譯它。從中他們還可以學(xué)習(xí)如何與服務(wù)器通信。在開發(fā)服務(wù)器時請記住這種情況。
進(jìn)一步閱讀
https://developer.android.com/training/articles/security-ssl

TA貢獻(xiàn)1966條經(jīng)驗 獲得超4個贊
我使用 ConnectivityManager 來檢測 VPN 服務(wù)是否啟用。使用它我停止調(diào)用 api 調(diào)用。
要檢測 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 調(diào)用:
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))
添加回答
舉報