热点认证技术实现

热点认证技术实现

代码可以在https://github.com/zhouyelihua/wifidog-yaha下载

背景

???当用户靠近路由器时候,打开App时候,会自动连接上金猪酒店提供的网络,当用户离开路由器的时候,或者关闭app之后会断开相关的网络连接。

方案一:

目前的技术调研

IOS的局限性

?apple公司关于wifi的相关api很少其中开放的api只有以下的代码可以实现扫描周边的wifi列表

objectivee-c

- (id)fetchSSIDInfo {

NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();

NSLog(@"Supported interfaces: %@", ifs);

id info = nil;

for (NSString *ifnam in ifs) {

info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);

self.textview.text=[NSString stringWithFormat:@"%@ => %@", ifnam, info];

self.label.text=[NSString stringWithFormat:@"%@ => %@", ifnam, info];

NSLog(@"%@ => %@", ifnam, info);

if (info && [info count]) { break; }

}

return info;

}

?所以苹果是不允许第三方连接的,所有的链接都只能跳转到wifi设置页面进行链接。对于开发者来说,想要在APP store上线你的应用,是不能调用私有的api。现在可以用的接口只能获取到Bssid,ssid,ssiddata,但是没有密码。但是,有些公司和苹果合作了,就会多开放一些接口。(好比开启wifi万能助手,在无线界面,在搜索到的wifi名称下有个一键连接wifi,这个效果就是苹果开放给某些公司的接口)。

?私有api的一个实现wifi链接 (http://blog.csdn.net/jiangnanshuilu/article/details/41145663)

?但是由于私有的api实现是不能再在app store上线的,所以这个方法是不可行。

IOS的相关可行的技术

可利用的技术

  1. 地理位置上传(技术成熟,未深入了解)
  2. iOS Configuration Profiles(http://nshipster.com/configuration-profiles/

    ?一个 configuration profile 可用于对设备进行多种设置。

    每个配置文件包括多个设置,其中每个可指定的配置,包括:

    • 白名单、AirPlay 的身份验证和 AirPrint 的目标
    • 建立 VPN,HTTP 代理服务器,无线网络和蜂窝网络
    • 配置电子邮件(SMTP,Exchange),日历(CalDAV),和联系人(CardDAV,LDAP,AD)
    • 限制访问应用程序,设备功能,Web内容和媒体回放
    • 管理证书和 SSO 凭据
    • 安装网页剪辑,应用程序和自定义字体

    该网站(http://support.citrix.com/content/dam/supportWS/kA460000000CcBICA0/iPhoneConfiguration.pdf)给出了一个Configuration Profiles能做的事情的详细描述

    有以下几种方法来部署配置文件:

    • 附加到电子邮件
    • 链接到一个网页
    • 使用无线配置
    • 使用 Apple Configurator

    而其中除了部署配置文件,在 Apple Configurator 还可以生成配置文件,以替代你自己手写 XML。(在实现的demo中也是采用这个方法的)

可行的方案

方案一

步骤

  1. 利用用户的app 检测到当前的位置
  2. 扫描附近的ssid,bssid与服务器端进行匹配获得相关的密码,
  3. 调其WiFi连接接口,要求用户手动输入wifi密码

分析

优点: 实现简单

缺点:每次都需要用户手动输入

方案二

步骤

  1. 利用用户的app 检测到当前的位置
  2. 扫描附近的ssid,bssid与服务器端进行匹配获得相关的密码,
  3. 构建iOS Configuration Profiles,通过iOS Configuration Profiles一键连接wifi

4.如果是通过网页形式配置profile可以添加一个确认页面,在这个页面上进行相关产品推荐

分析

优点:减少用户的手工输入

缺点:实现较为复杂

不足点分析

  1. 不能实现退出app的同时退出网络,只能给路由器设置相关密码,定时更换
  2. 需要服务器端记录不同位置的wifi的密码
  3. 需要app启动位置的相关服务

Demo实现

利用已知的一个ssid和密码,将这个保存为iOS Configuration Profiles。将生成的profile放在github上(https://raw.githubusercontent.com/zhouyelihua/wifi/master/wifi2.mobileconfig),采用以下代码

     NSURL *url = [NSURL URLWithString:@"https://raw.githubusercontent.com/zhouyelihua/wifi/master/wifi2.mobileconfig"];
     [[UIApplication sharedApplication] openURL:url];

系统会提示安装profile之后就可以连接上网络。

Android的可行性分析

1.android可以调用系统的android.hardware.wifi,好吧问题解决

2.android通过(String SSID, String Password, WifiCipherType Type) 就可以连接ssid的wifi

3.android的实现具体流程:

3.1 android 检测到酒店SSId

3.2通过地址或者bssid从服务端获得相关密码

3.3利用得到的相关密码直接连接网络

方案二:

调查

现状调查

?你一定有过以下经历:你到一个饭店吃饭,饭店提供了免费WiFi上网服务,你用手机连接饭店的WiFi信号,连接成功之后,在浏览器输入任意网址,都会自动跳出来一个认证界面,然后你需要进行认证登陆,认证登陆的方式多种多样,QQ登陆,微信登陆,或者是专用软件的登陆。认证登陆通过之后,就可以上网了。

??该服务的流程:

????1. 用户打开手机发现不需要密码的wifi,连接wifi

????2. 用户打开网页跳转到相关的页面,要求用户输入相关的信息,或者调用相关软件才能正确联网。(微信开发者服务提供类似的服务http://mp.weixin.qq.com/wiki/2/55f1e301f4558846d2bf0dd51543e252.html#.E9.A1.BE.E5.AE.A2.E8.BF.9E.E7.BD.91.E8.BF.87.E7.A8.8B

????3. 认证通过之后给予网络连接

背后的技术

硬件要求

  1. 路由器(需要为ddwrt或者openwrt固件的路由器,或者手动刷固件,使其能够支持wifidog)
  2. 服务器(主要是用于相关的认证和提供认证的页面)

wifi热点的安装流程

?现在基于wifi运营的相关公司比较多,所以wifi热点认证技术也相对比较火。而这个过程当中一般采用的都是开源的wifidog来实现相关的功能。WiFiDog是用来做无线WiFi热点认证管理的一套开源工具。

首先简单的介绍一下相关的wifidog的工作流程:

  1. 首先客服端发起相关的网络请求
  2. 安装wifidog的路由器将网络请求定向到设置的认证服务器页面
  3. 进行相关的服务认证(wifidog认证服务器主要需要实现以下几个页面[login,auth,portal,gw_message,ping] )
  4. 连接上网

方案

  1. 在指定地点放置配置好wifidog的路由器
  2. 用户靠近时候,连接wifi(手机自动连接无密码的wifi),发起网页请求

    2.1 用户有安装app,调起app登陆,连接上网(类似微信认证)

    2.2 用户没有安装app

    2.2.1 给出自动下载连接?(wifidog防火墙配置方形相关网页请求)
    
    2.2.2 直接网页登陆,登陆之后跳转相关下载页面(会给人一种不安全的感觉,因为app账号就是淘宝账号)
    
  3. 服务器端进行认证连接

具体的实现

路由器的设置

1.本人采用的是小米的mini路由器,首先需要对路由器进行刷openwrt的操作

本人参考的是一下网址(http://tieba.baidu.com/p/3618514879)

2.需要对刷完openwrt的路由器进行刷wifidog

2.1 首先利用电脑先连接上路由器

2.2 利用ssh连接上路由器。一般是ssh [email protected] 初始的密码是admin

2.3 设置路由器的源。可以直接登录网页添加以下源

src/gz r2_base http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/base
src/gz r2_management http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/management
src/gz r2_oldpackages http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/oldpackages
src/gz r2_packages http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/packages
src/gz r2_routing http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/routing
src/gz r2_telephony http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/telephony

或者采用命令的方式

   dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
src/gz r2_base http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/base
src/gz r2_management http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/management
src/gz r2_oldpackages http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/oldpackages
src/gz r2_packages http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/packages
src/gz r2_routing http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/routing
src/gz r2_telephony http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/telephony
2.4     安装wifidog
```
[[email protected]:/root]#opkg update

[[email protected]:/root]#opkg install wifidog

[[email protected]:/root]#/etc/init.d/wifidog enable

[[email protected]:/root]#/etc/init.d/wifidog start

2.5 配置wifidog

输入命令

vim /etc/wifidog.conf“`

 AuthServer {
Hostname 192.168.1.25#此处是你的服务器设置的地址
HTTPPort 8080
Path /wifidog/index.php/wifidog/
LoginScriptPathFragment         login/?
PortalScriptPathFragment        portal/?
MsgScriptPathFragment           gw_message.php?
PingScriptPathFragment          ping/?
AuthScriptPathFragment          auth/?
}
2.6启动wifidog
/etc/init.d/wifidog enable
/etc/init.d/wifidog start

3.设置服务器

此处采用的是基于web.py实现的。安装了pip的同学,可以直接输入命令 :pip install web.py既可。

我们的python服务器的实现如下

#!/usr/bin/env python
#coding=utf-8
import web
import time

urls = (
    ‘/‘, ‘index‘,
    ‘/xml/.*‘, ‘pushxml‘,
    ‘/login/.*‘, ‘login‘,
    ‘/logout/.*‘, ‘logout‘,
    ‘/auth.*‘,‘auth‘,
    ‘/auth/.*‘,‘auth‘,
    ‘/ping/.*‘,‘ping‘,
    ‘/ping.*‘,‘ping‘,
    ‘/login‘,‘login‘,
    ‘/portal/.*‘,‘portal‘,
    ‘/portal.*‘,‘portal‘,

)
render = web.template.render(‘templates/‘)
web.config.debug = False
app = web.application(urls, locals())
session = web.session.Session(app, web.session.DiskStore(‘sessions‘))
session.login=False
class index():
    def GET(self):
        try:
            if session.logged_in == True:
                return ‘<h1>You are logged in</h1><a href="/logout">Logout</a>‘
        except AttributeError:
            pass
        return ‘<h1>You are not logged in.</h1><a href="/login">Login now</a>‘

def authorize(func):
    def logged(*args,**dic):
        if session.logged_in==True:
            func(*args,**dic)
        else:
            raise web.seeother(‘/login‘)
    return logged

class pushxml():
    # @authorize
    def GET(self):
        try:
            if session.logged_in == True:
                web.header(‘Content-Type‘, ‘text/xml‘)
                i = web.input(data=None)
                return render.response(i.data)
        except AttributeError:
            pass

class login():
    def GET(self):
        try:
            session.logged_in = False
        except AttributeError:
            pass
        return """
              <html lang="utf-8">
            <head>
            <title>金猪酒店de</title>
            <meta charset="utf-8"/>

                <script>
//产生日期随机数
                var now=new Date();
                var number = now.getSeconds() * now.getMinutes() * now.getHours() * now.getDate() * now.getYear() + Math.floor(Math.random()*10099+99);
//输出查看
                document.write(number)
                </script>

                </head>
                <body>
                <center>
                <h1>免费热点登录</h1><br />
                <a href="#" onclick="this.href=‘http://192.168.1.1:2060/wifidog/auth?token=123445‘"><h2>点此登录<h2></a>
                </center>
                </body>
                </html>
        """

    def POST(self):
        login_data = web.input()
        if login_data.user == ‘a‘ and login_data.passwd == ‘a‘:
            session.logged_in = True
            print "posted"
            print session
            raise web.seeother(‘/auth?token=122‘)

class logout():
    def GET(self):
        try:
            session.logged_in = False
            session.kill()
        except AttributeError:
            pass
        raise web.seeother(‘/auth‘)
class auth():
    """docstring for ClassName"""
    def GET(self):
        return "Auth: 1"
class portal():
    """docstring for ClassName"""
    def GET(self):
        return """
        <html lang="utf-8">
        <head>
        <title>欢迎界面</title>
        <meta charset="utf-8"/>
        </head>
        <body>
        <center>
        <h1>你已经成功登录网络!</h1><br />
        <!-- <a href="http://100.64.100.100:2060/wifidog/auth?logout=1&token="><h2>点此退出<h2></a> -->
        </center>
        </body>
        </html>
        """
class ping():
    """docstring for ClassName"""
    def GET(self):
        return "Pong"
if __name__ == ‘__main__‘:
    app.run()
  1. app端的实现,其实很简单我们把连接网络和断开网络的两个函数贴出来
-(void)requestData{
    // 1 创建URL对象
    NSString*  uu=[NSString stringWithFormat:@"http://192.168.1.1:2060/wifidog/auth?token=%ld",(long)self.token];
    NSURL *url = [NSURL URLWithString:uu];

    // 2 创建请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    // 2.1 创建请求方式 (默认是get这一步可以不写)
    [request setHTTPMethod:@"get"];

    // 3 创建响应对象(有时会出错)
    NSURLResponse *response= nil;

    // 4 创建连接对象(同步)
    NSError *error;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
  //  NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"");
    NSLog(@"");
}
-(void)disconnect{
    // 1 创建URL对象
    NSString*  uu=[NSString stringWithFormat:@"http://192.168.1.1:2060/wifidog/auth?logout=1&token=%ld",(long)self.token];
    NSURL *url = [NSURL URLWithString:uu];

    // 2 创建请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    // 2.1 创建请求方式 (默认是get这一步可以不写)
    [request setHTTPMethod:@"get"];

    // 3 创建响应对象(有时会出错)
    NSURLResponse *response= nil;

    // 4 创建连接对象(同步)
    NSError *error;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    //  NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"");
    NSLog(@"");
}
时间: 2024-10-29 19:10:53

热点认证技术实现的相关文章

使用wiwiz实现WiFi无线热点认证与计费网关

本文介绍如何利用Wiwiz HotSpot Builder系统在笔记本电脑上创建WiFi无线热点认证网关并实现计费管理. 随着WiFi与WLAN技术的普及,现在,架设一个无线热点变得越来越容易.一般,只需要购买一个普通的无线路由器,通过简单的设置SSID,WEP或WPA加密设置之后就可以组建一个无线局域网了.这种无线局域网在一般的家庭或小型企业中很常见.但是这种应用模式并不能满足商业应用或运营级的企业应用.作为商业应用的无线WiFi热点仅仅为用户提供简单的网络互连是不够的,还需要网络接入的认证机

转载:校园网接入认证技术对比与分析

原文作者: 沙捷 费青松 王雁 作者单位:首都体育学院 信息网络中心 北京市海淀区北三环西路 11号 100088 1 概述 Internet网络是一个自助网络,免费使用,一个用户终端配置IP地址即可接入网络.IP网络规模的扩大使得管理问题凸现,而不管是运营商的IP城域网还是校园网都有运营收费的需求,但是 在校园网中引入用户认证技术,有两个目的,一是可以有效的识别上网用户身份,第二是便于对用户的接入权限.业务权限.用户行为等进行有效的控制和管理,包括提供灵活的计费手段.基于IP地址的用户管理显然

软考之路(5)——计算机组成原理之加密技术和认证技术

在软考的题目中总会出现一两道关于加密技术和认证技术的题目.比如:2012年11月的上午题的第(8)和第(9)题: 用户B收到用户A带数字签名的消息M,为了验证M的真实性,首先须要从CA获取用户A的数字验证书,并利用( 8 )验证该证书的真伪,然后利用( 9 )验证M的真实性. (8)A.CA的公钥   B.B的私钥   C.A的公钥   D.B的公钥 (9)A.CA的公钥   B.B的私钥   C.A的公钥   D.B的公钥 这类题目绝对不难.仅仅要你弄清楚了加密技术与认证技术,这样的题目应该是

哈希表 之 接入与身份认证技术概述

1 概述 随着信息化的高速发展,对国家.组织.公司或个人来说至关重要的信息越来越多的通过网络来进行存储.传输和处理,为获取这些关键信息的各种网络犯罪也对应急剧上升. 当前,网络安全在某种意义上已经成为一个事关国家安全.社会经济稳定的重大问题.得到越来越多的重视. 在网络安全中.身份认证技术作为第一道,甚至是最重要的一道防线.有着重要地位,可靠的身份认证技术能够确保信息仅仅被正确的"人"所訪问.身份认证技术提供了关于某个人或某个事物身份的保证.这意味着当某人(或某事)声称具有一个特别的身

信息认证技术

这个章节会介绍一些比较有意思的东西,例如哈希函数,数字签名,身份认证等! 1.一个安全的认证 系统应满足什么样的条件? 合法的接受者能够检验所接受消息的合法性和真实性 合法的发送方对所发送的消息无法进行否认 除了合法的发送方之外,任何人都无法伪造和篡改消息 2.消息验证:验证消息的完整性和不可抵赖性 身份认证:鉴别用户身份 哈希函数 1.哈希函数必须具有哪些性质? 给定M ,很容易计算h 给定h,根据H(M) = h 推导出M很难,这个性质称为单向性 给定M,通过同一个H(`),计算出不同的h是

宽带认证计费系统的认证技术主要有哪些

宽带的认证技术在宽带认证计费系统中有着不可或缺的地位,因为宽带认证技术对宽带认证计费有着非常重要的帮助,下面时讯无线为大家介绍一下宽带认证计费系统的认证技术主要有哪些. 宽带认证计费 宽带认证计费系统的认证技术主要有哪些 常见认证技术 宽带认证技术是宽带计费系统的一个重要组成部分,它是对用户进行上网管理控制的基本必要技术手段.目前宽带常见的宽带认证技术,包括WEB认证.客户端认证.PPPOE认证.802.1X认证等.其中WEB认证和客户端认证是最常用的宽带认证技术,PPPOE认证是以前窄带电话线

城市热点认证计费系统应用

随着互联网技术的快速发展和企业信息系统应用的普及,企业网络中的办公用户对宽带互联网接入提出了强烈要求.大型企业通信部门不仅需要在企业内部提供快捷方便的宽带上网服务和信息服务,还需要针对不同的企业网络用户实施不同的管理策略,以确保业务发展和员工工作效率不受宽带互联网的影响访问. 长虹成立于1958年,现已成为一家综合性的跨国企业集团,集军事工业,消费电子和核心器件研发制造于一体,从军工,彩电到信息技术.家电内容和服务提供商的信息正在推进. 现在,网络管理已经越来越广泛,越来越多的产品,尤其是大型企

亚通声纹认证技术助力网络身份认证

社交媒体注册.网上购物.在线银行交易--在人们的日常生活中,需要网络实名认证的越来越多. 烟台亚通网络科技有限公司出品的声纹验证引擎为各适应各类场合提供网络身份认证服务. 提供更专业的私有云部署 避免了其他厂商的公有云无法应用于各类机密等级较高的内网系统. 中国科学院院士张钹指出,保证信息安全是关系到国计民生的重大问题,而身份认证则是其中至关重要的部分.虽然信息技术发展日新月异,但要让每一个人在任何情况下都有一个唯一不变的身份信息,仍是一个非常难的课题. 据了解,目前身份验证的方法大致分为:基于

邮件安全之邮件认证技术

随着互联网的高速发展,企业信息化建设不断深入,邮箱作为商务沟通.信息存储的载体,在企业发展中扮演着越来越重要的角色,邮箱安全的重要性不言而喻. 然而近年来,网络中的钓鱼邮件无孔不入,新型骗术防不胜防,邮箱被钓鱼事件时有发生,一旦中招,给企业造成巨大损失的同时,也让企业的诚信形象大打折扣. 钓鱼邮件指利用伪装的电邮,欺骗收件人将帐号密码.口令等信息回复给指定的接收者:或引导收件人连接到特制的网页(这些网页通常会伪装成和真实网站一样,令登录者信以为真),输入帐号密码等信息从而盗取接收者信息邮件协议在