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>