Android之连接指定SSID的无线网络

SSID指的是无线网络的名称全程为Service Set Identifier


通过查阅网上资料找到了连接指定SSID的方法,无线网络可以是三种简单的方式
1. 无加密
2. wep加密
3. wpa加密


以下即为三种方式的介绍
一、Open System
完全不认证也不加密,任何人都可以连到无线基地台使用网络。
二、WEP (Wired EquivalentPrivacy) 有线等效加密
最基本的加密技术,手机用户、笔记型计算机与无线网络的Access Point(网络金钥AP)拥有相同的网络金钥,才能解读互相传递的数据。这金钥分为64bits及128bits两种,最多可设定四组不同的金钥。当用户端进入WLAN前必须输入正确的金钥才能进行连接。
WEP加密方法很脆弱。网络上每个客户或者计算机都使用了相同的保密字,这种方法使网络偷听者能刺探你的密钥,偷走数据并且在网络上造成混乱。
三、WPA (Wi-Fi Protected Access) 商务宝采用的加密方式
由Wi-FiAlliance (http://www.wi-fi.com/)所提出的无线安全标准,有分成家用的WPA-PSK (Pre-Shared Key)与企业用的WPA-Enterprise版本。
1、WPA-PSK

为了堵塞WEP的漏洞而发展的加密技术,使用方法与WEP相似。无线基地台与笔记型计算机必须设定相同的Key,计算机才可以连入基地台。但其进入WLAN时以更长词组或字串作为网络金钥。并且WPA-PSK运用了TKIP (Temporal Key IntegrityProtocol)技术,因此比WEP难被破解而更加安全。

WPA-PSK通过为每个客户分配唯一的密钥而工作,但需要给雇员密码以便登陆系统。这样,外部的人可通过他们享用网络资源。如果你希望修改密码(建议每隔一段时间修改密码以防止偷听者解码),你可能得跑到每台电脑前去输入新的密码。

2、WPA-Enterprise

采用IEEE 802.1x则需要有另一台储存无线使用者账户数据的RADIUS (RemoteAuthentication Dial-In User Service)服务器,当笔记型计算机连入无线基地台时,无线基地台会要求使用者输入账号密码、或是自动向笔记型计算机索取储存在计算机硬盘的使用者数字凭证,然后向RADIUS服务器确认使用者的身分。而用来加密无线封包的加密金钥(Key),也是在认证的过程中自动产生,并且每一次联机所产生的金钥都不同(专业术语称为SessionKey),因此非常难被破解。

用用户名和密码安全登陆网络后,每个客户会自动得到一个唯一的密钥,密钥很长并且每隔一段时间就会被更新。这样wi-Fi监听者就不能获取足够的数据包来解码密钥。即使一个密钥因为某种原因被解码了,富于经验的黑客有可能发现新的密钥,但是加密锁已经变了。

一但应用了WPA-Enterprise,不像WPA-PSK那样,雇员将不会知道密码。这样,外部的人

就不能通过他们享用网络资源。WPA-Enterprise还可以节约你大量的时间;你无需花费大量的时间去人工更换客户的密码。

四、WPA2

WPA2顾名思义就是WPA的加强版,也就是IEEE802.11i无线网络标准。同样有家用的PSK版本与企业的IEEE 802.1x版本。WPA2与WPA的差别在于,它使用更安全的加密技术AES (Advanced Encryption Standard),因此比WPA更难被破解、更安全。

五、MAC ACL (Access Control List)

MAC ACL只能用于认证而不能用于加密。在无线基地台输入允许被连入的无线网卡MAC地址,不在此清单的无线网卡无法连入无线基地台。

六、Web Redirection

这种方式是WISP(Wireless Internet Service Provider,例如统一安源WiFly)最常用的方式。无线基地台设定成Open System,但是另外在后台利用存取控制网关器(Access Control Gateway, ACG),拦截笔记型计算机发出的Web封包(开启浏览器尝试上网),并强制重导到认证网页要求输入账号密码,然后ACG向RADIUS认证服务器来确认使用者的身分,认证通过才可以自由到其它的网站。

七、各种加密方式对比

WEP安全加密方式

  WEP特性里使用了rsa数据安全性公司开发的rc4 prng算法。全称为有线对等保密(Wired EquivalentPrivacy,WEP)是一种数据加密算法,用于提供等同于有线局域网的保护能力。使用了该技术的无线局域网,所有客户端与无线接入点的数据都会以一个共享的密钥进行加密,密钥的长度有40位至256位两种,密钥越长,黑客就需要更多的时间去进行破解,因此能够提供更好的安全保护。

  WPA安全加密方式

  WPA加密即Wi-Fi Protected Access,其加密特性决定了它比WEP更难以入侵,所以如果对数据安全性有很高要求,那就必须选用WPA加密方式了(Windows XP SP2已经支持WPA加密方式)。

  WPA作为IEEE 802.11通用的加密机制WEP的升级版,在安全的防护上比WEP更为周密,主要体现在身份认证、加密机制和数据包检查等方面,而且它还提升了无线网络的管理能力。

  WPA、WEP对比

  WPA与WEP不同,WEP使用一个静态的密钥来加密所有的通信。WPA不断的转换密钥。WPA采用有效的密钥分发机制,可以跨越不同厂商的无线网卡实现应用。另外WPA的另一个优势是,它使公共场所和学术环境安全地部署无线网络成为可能。而在此之前,这些场所一直不能使用WEP。WEP的缺陷在于其加密密钥为静态密钥而非动态密钥。这意味着,为了更新密钥,IT人员必须亲自访问每台机器,而这在学术环境和公共场所是不可能的。另一种办法是让密钥保持不变,而这会使用户容易受到攻击。由于互操作问题,学术环境和公共场所一直不能使用专有的安全机制。

  WPA2:目前最强的无线加密技术

  WPA2是WiFi联盟验证过的IEEE 802.11i标准的认证形式,WPA2实现了802.11i的强制性元素,特别是Michael算法被公认彻底安全的CCMP(计数器模式密码块链消息完整码协议)讯息认证码所取代、而RC4加密算法也被AES所取代。

  在WPA/WPA2中,PTK的生成是依赖于PMK的,而PMK的方式有两种,一种是PSK方式,也就是预共享密钥模式(pre-shared key,PSK,又称为个人模式),在这种方式中PMK=PSK;而另一种方式则需要认证服务器和站点进行协商来产生PMK。下面我们通过公式来看看WPA和WPA2的区别:

  WPA = IEEE 802.11idraft 3 = IEEE 802.1X/EAP + WEP(选择性项目)/TKIP

  WPA2 = IEEE 802.11i =IEEE 802.1X/EAP + WEP(选择性项目)/TKIP/CCMP

  目前WPA2加密方式的安全防护能力非常出色,只要你的无线设备均支持WPA2加密,那你将体验到最安全的无线网络生活。即使是目前最热的“蹭网卡”也难以蹭入你的无线网络,用户大可放心使用。

连接指定的无线的代码如下所示:(引用自这里写链接内容)

public class WifiAdmin {   
    // 定义WifiManager对象    
    private WifiManager mWifiManager;   
    // 定义WifiInfo对象    
    private WifiInfo mWifiInfo;   
    // 扫描出的网络连接列表    
    private List mWifiList;   
    // 网络连接列表    
    private List mWifiConfiguration;   
    // 定义一个WifiLock    
    WifiLock mWifiLock;   


    // 构造器    
    public WifiAdmin(Context context) {   
        // 取得WifiManager对象    
        mWifiManager = (WifiManager) context   
                .getSystemService(Context.WIFI_SERVICE);   
        // 取得WifiInfo对象    
        mWifiInfo = mWifiManager.getConnectionInfo();   
    }   

    // 打开WIFI    
    public void openWifi() {   
        if (!mWifiManager.isWifiEnabled()) {   
            mWifiManager.setWifiEnabled(true);   
        }   
    }   

    // 关闭WIFI    
    public void closeWifi() {   
        if (mWifiManager.isWifiEnabled()) {   
            mWifiManager.setWifiEnabled(false);   
        }   
    }   

    // 检查当前WIFI状态    
    public int checkState() {   
        return mWifiManager.getWifiState();   
    }   

    // 锁定WifiLock    
    public void acquireWifiLock() {   
        mWifiLock.acquire();   
    }   

    // 解锁WifiLock    
    public void releaseWifiLock() {   
        // 判断时候锁定    
        if (mWifiLock.isHeld()) {   
            mWifiLock.acquire();   
        }   
    }   

    // 创建一个WifiLock    
    public void creatWifiLock() {   
        mWifiLock = mWifiManager.createWifiLock("Test");   
    }   

    // 得到配置好的网络    
    public List getConfiguration() {   
        return mWifiConfiguration;   
    }   

    // 指定配置好的网络进行连接    
    public void connectConfiguration(int index) {   
        // 索引大于配置好的网络索引返回    
        if (index > mWifiConfiguration.size()) {   
            return;   
        }   
        // 连接配置好的指定ID的网络    
        mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,   
                true);   
    }   

    public void startScan() {   
        mWifiManager.startScan();   
        // 得到扫描结果    
        mWifiList = mWifiManager.getScanResults();   
        // 得到配置好的网络连接    
        mWifiConfiguration = mWifiManager.getConfiguredNetworks();   
    }   

    // 得到网络列表    
    public List getWifiList() {   
        return mWifiList;   
    }   

    // 查看扫描结果    
    public StringBuilder lookUpScan() {   
        StringBuilder stringBuilder = new StringBuilder();   
        for (int i = 0; i < mWifiList.size(); i++) {   
            stringBuilder   
                    .append("Index_" + new Integer(i + 1).toString() + ":");   
            // 将ScanResult信息转换成一个字符串包    
            // 其中把包括:BSSID、SSID、capabilities、frequency、level    
            stringBuilder.append((mWifiList.get(i)).toString());   
            stringBuilder.append("/n");   
        }   
        return stringBuilder;   
    }  

    // 得到MAC地址    
    public String getMacAddress() {   
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();   
    }   

    // 得到接入点的BSSID    
    public String getBSSID() {   
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();   
    }   

    // 得到IP地址    
    public int getIPAddress() {   
        return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();   
    }   

    // 得到连接的ID    
    public int getNetworkId() {   
        return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();   
    }   

    // 得到WifiInfo的所有信息包    
    public String getWifiInfo() {   
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString();   
    }   

    // 添加一个网络并连接    
    public void addNetwork(WifiConfiguration wcg) {   
     int wcgID = mWifiManager.addNetwork(wcg);   
     boolean b =  mWifiManager.enableNetwork(wcgID, true);   
     System.out.println("a--" + wcgID);  
     System.out.println("b--" + b);  
    }   

    // 断开指定ID的网络    
    public void disconnectWifi(int netId) {   
        mWifiManager.disableNetwork(netId);   
        mWifiManager.disconnect();   
    }   

//然后是一个实际应用方法,只验证过没有密码的情况:  

    public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type)   
    {   
          WifiConfiguration config = new WifiConfiguration();     
           config.allowedAuthAlgorithms.clear();   
           config.allowedGroupCiphers.clear();   
           config.allowedKeyManagement.clear();   
           config.allowedPairwiseCiphers.clear();   
           config.allowedProtocols.clear();   
          config.SSID = "\"" + SSID + "\"";     

          WifiConfiguration tempConfig = this.IsExsits(SSID);             
          if(tempConfig != null) {    
              mWifiManager.removeNetwork(tempConfig.networkId);    
          }  

          if(Type == 1) //WIFICIPHER_NOPASS  
          {   
               config.wepKeys[0] = "";   
               config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);   
               config.wepTxKeyIndex = 0;   
          }   
          if(Type == 2) //WIFICIPHER_WEP  
          {   
              config.hiddenSSID = true;  
              config.wepKeys[0]= "\""+Password+"\"";   
              config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);   
              config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);   
              config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);   
              config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);   
              config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);   
              config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);   
              config.wepTxKeyIndex = 0;   
          }   
          if(Type == 3) //WIFICIPHER_WPA  
          {   
          config.preSharedKey = "\""+Password+"\"";   
          config.hiddenSSID = true;     
          config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);     
          config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);                           
          config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);                           
          config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);                      
          //config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);    
          config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);  
          config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);  
          config.status = WifiConfiguration.Status.ENABLED;     
          }  
           return config;   
    }   

    private WifiConfiguration IsExsits(String SSID)    
    {    
        List existingConfigs = mWifiManager.getConfiguredNetworks();    
           for (WifiConfiguration existingConfig : existingConfigs)     
           {    
             if (existingConfig.SSID.equals("\""+SSID+"\""))    
             {    
                 return existingConfig;    
             }    
           }    
        return null;     
    }  

}  
//分为三种情况:1没有密码2用wep加密3用wpa加密  

改动主要集中在CreateWifiInfo这个方法中,并且添加了一个私有方法:
(1)将与方法的第三个参数有关的变量都改成int型,或者使用原作者的枚举型(存在bug需要改正),但枚举会在后续的开发中遇到些困难;
(2)在if(type == 3)中注释掉“config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);”,并添加“
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);“这两句,否则当wifi热点需要输入密码时,无法加入网络。
(3)在代码末尾添加了方法IsExsits,原因在于如果按照网上介绍的方法成功加入指定的wifi后,都会在终端的wifi列表中新添加一个以该指定ssid的网络,所以每运行一次程序,列表中就会多一个相同名字的ssid。而该方法就是检查wifi列表中是否有以输入参数为名的wifi热点,如果存在,则在CreateWifiInfo方法开始配置wifi网络之前将其移除,以避免ssid的重复:
WifiConfiguration tempConfig = this.IsExsits(SSID);
if(tempConfig != null) {
mWifiManager.removeNetwork(tempConfig.networkId);
}
以上便是wifi工具类的建立,之后就可以在其他部分实例化这个类,调用其中的方法完成加入指定ssid的wifi热点,还是先上代码吧,建立一个名为Test_wifiActivity.java的文件(同上,没有包含包声明和impo

public class Test_wifiActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WifiAdmin wifiAdmin = new WifiAdmin(this);
wifiAdmin.openWifi();
wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo(“XXX”, “XXX”, 3));
}
}
大体上只涉及到openWifi(打开wifi)、CreateWifiInfo(配置wifi网络信息)和addNetwork(添加配置好的网络并连接),对CreateWifiInfo进行简单的说明:第一参数是SSID的名称;第二个参数是指定SSID网络的密码,当不需要密码是置空(”“);第三个参数是热点类型:1-无密码 / 2-WEP密码验证(未测试)/ 3-WAP或WAP2 PSK密码验证。
最后就是在Manifest中添加相应的权限了:

    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" >uses-permission>  
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >uses-permission>  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >uses-permission>  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >uses-permission> 

你可能感兴趣的:(android,加密,网络,wired)