java - 除非我的应用程序批准,否则阻止 Android 手机连接到 WiFi 网络?

标签 java android security android-wifi wifimanager

我想开发一个应用程序,除非我批准,否则它会阻止连接到 WiFi 网络。我希望能够查询接入点的 MAC 地址,并将其与对应于 SSID 的已知地址列表进行比较。该应用程序的目标是防止用户意外连接到恶意访问点,例如可以使用 pineapple devices 生成的类型.

我的研究并不清楚我将如何实现这一目标。 How to be notified on wifi network status change?等问题解释如何检测连接已经发生,但是对于我的用例来说已经太晚了。

ConnectivityManagerWifiManager 似乎都没有提供添加可能会中断正在进行的连接的监听器的方法。

我对解决方案的一些想法:

  • 将自己安装为代理并决定是否允许数据通过。但是,这似乎不是基于 Do Android proxy settings apply to all apps on the device? 的选项。 (提示:答案是“否”)。

  • 用我自己创建的东西替换现有的 WiFi 管理器。但是,我真的很难在 Android 开发人员指南中找到有关更换系统组件的任何信息。因此,我不确定这在非 root 手机上是否可行。

  • 将网络密码存储在我的应用程序中,并将 WiFi 管理器中的密码设置为无意义的值。然后捕获一条警告连接失败的广播消息(大概类似于 WifiManager.WPS_AUTH_FAILURE)并有选择地决定重新连接回该网络。可能是一个可能的(如果丑陋的)解决方案,但我可以在网络仍然连接时将密码设置回无意义的值,以确保我们不会悄悄地连接到另一个同名的 SSID?我不确定。我突然想到菠萝设备可能会接受任何密码,因此这种方法无效。

  • 想办法阻止 Android 自动连接到已知网络(即以前使用过的网络或存储有密码的网络)。然后我可以管理我的应用程序的所有连接/断开连接。但是,我看不到如何在手机上手动执行此操作,因此我怀疑这是否可以通过编程方式实现。

任何人都可以提出一种适用于非 root 手机的方法吗?

最佳答案

如果不给设备root,你就无法实现一个非常强大的系统。我认为这是你能得到的最接近的:

  1. 使用 getConfiguredNetworks()获取用户设备上当前配置的网络列表
  2. 对于每个 WifiConfiguration在列表中,设置公共(public)字段BSSID到所需的“安全”MAC 地址
  3. 调用 saveConfiguration()持久化更改

或者,对于步骤 (2.),您可以调用 disableNetwork()为每个配置的网络,并根据 BSSID 有选择地启用它们。请注意,MAC 地址仍然很容易被欺骗。

关于java - 除非我的应用程序批准,否则阻止 Android 手机连接到 WiFi 网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26687211/

相关文章:

java - 谷歌 androidpublish api access_token

c - 我正在寻找使用 pkcs#5 的 C 示例

php - 这是什么类型的哈希/加密? '0E0B020601'

java - 如何使用Spring MVC+Maven+Tomcat搭建普通项目?

java - 正则表达式从链接中提取值

java - Selenium HtmlUnitDriver 不点击按钮

android - 如何验证官方 Google apk

ruby-on-rails - 如何破解您自己的 Rails 站点?

java - 如何调用Parent重写方法

java - 用Java从ZIP压缩包中提取UTF-16编码的文件