WebApi与手机客户端通信安全机制

WebApi与手机客户端通信安全机制

最近公司有几个项目需要开发手机客户端,服务器端选用WebApi,那么如何保证手机客户端在请求服务器端时数据不被篡改,如何保证一个http请求的失效机制,下面总结一下我们在项目中针对这两个问题的解决方案。

基本思路如下:

  用户在成功登陆app客户端之后,手机客户端向服务器端发出的所有的http请求在请求头(HttpHeader)上都会带上下面三个参数:1、Uid(用户ID),2、Ts(时间戳),3、Sign(签名)。其中Ts是当前时间减去1970-1-1得到的10位的时间时间戳数字,Sign是接口中所有http请求参数与Uid、Ts经过MD5加密后得到的一个字符串。

具体实现如下(客户端的实现,手机客户端生成下面两个参数的思路是一样的):

1、Ts时间戳

Ts参数可以保证请求的时效性,在手机客户端生成的Ts,在服务器端验证一下,保证请求是在我们规定的时间段内,具体代码如下:

(1)、生成Ts(C#)代码如下,Andriod和IOS可以同理生成

 /// <summary>
        /// 获取十位的时间戳
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public string GenerateTimeStamp(DateTime dt)
        {
            // Default implementation of UNIX time of the current UTC time
            TimeSpan ts = dt.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }  

(2)、服务器端端验证Ts代码如下,我们规定从手机客户端发到服务器端的请求有效期为5分钟,时间戳参数是跟在Http请求头中

//获取请求头信息
            var requestHeader = HttpContext.Current.Request.Headers;

            //10位时间戳
            var Ts = requestHeader.Get("Ts");
            //验证Ts是否合法(请求时间有效时间为:加减5分钟)
            var ts = Ts;//10位时间戳
            if (ts.Length != 10)
            {
                var resp = Request.CreateResponse<string>(HttpStatusCode.OK, "请求已过期", "application/json"); ;

                throw new HttpResponseException(resp);
            }
            var tsDate = ComHelper.ConvertIntDateTime(ts.ToString());
            if (tsDate > DateTime.Now.AddMinutes(5) || tsDate < DateTime.Now.AddMinutes(-5))
            {
                var resp = Request.CreateResponse<string>(HttpStatusCode.OK, "请求已过期", "application/json"); ;

                throw new HttpResponseException(resp);
            }

(3)、ComHelper公共类代码如下

 ComHelper

2、Sign签名

(1)、sign的生成规则:服务器端接口中的所有参数+Uid+Ts,去除掉参数中值为空的参数后, 按照参数key值排序,用&链接,并全部转化为小写,然后用MD5加密,通过HttpHeader发送到服务器端接口。

生成Sign大代码如下(C#),Android和IOS可以同理生成

假如手机客户端请求的一个API接口为:http://weapi.com/order/getlist?StatusID=1&CarID=2&CityID=3&name=&key=222

sign=md5(carid=2&cityid=3&key=222&statusid=1&ts=0123456789&uid=110)

(2)、验证客户端的Sign,防止参数被修改

 //请求签名,客户端生成的签名
            var Sign = requestHeader.Get("Sign");
//排序字典,按照key排序
            SortedDictionary<string, string> postValue = null;
            //获取请求中所有的参数
            postValue = ComHelper.GetRequestSortDic(true);
            postValue.Add("Uid", Uid);//API账户名称
            postValue.Add("Ts", Ts);//10位时间戳 

            string APIPrivateKey = "2D7E7C96-DAC5-4526-96C3-C60CDEC4B120";//客户端和手机端保持一致
            //服务器端生成的Sign
            string mysign = ComHelper.GetResponseMysign(postValue, APIPrivateKey);
            if (!Sign.Equals(mysign, StringComparison.InvariantCultureIgnoreCase))
            {
                var resp = Request.CreateResponse<string>(HttpStatusCode.OK, "签名错误", "application/json"); ;

                throw new HttpResponseException(resp);
            }

3、模拟测试

(1)C#模拟Http请求,代码如下

 //请求的API地址
            string url = "http://localhost:51942/api/Values/Get?StatusID=1&CarID=2&CityID=3&name=&key=1233";
            //生成Ts
            string Ts = ComHelper.GenerateTimeStamp(DateTime.Now);
            //SortedDictionary会自动按照key值排序
            SortedDictionary<string, string> sortDic = new SortedDictionary<string, string>();
            sortDic.Add("StatusID", "1");
            sortDic.Add("CarID", "2");
            sortDic.Add("CityID", "3");
            sortDic.Add("name", "");
            sortDic.Add("key", "1233");
            sortDic.Add("Uid","110");
            sortDic.Add("Ts", Ts);
            string APIPrivateKey = "2D7E7C96-DAC5-4526-96C3-C60CDEC4B120";//客户端和手机端保持一致,md5加密多使用了一个参数
            //获取Sign签名
            string Sign = ComHelper.GetResponseMysign(sortDic, APIPrivateKey);

            //发送请求
            System.Net.WebRequest wReq = System.Net.WebRequest.Create(url);
            wReq.Headers.Add("Uid", "110");
            wReq.Headers.Add("Ts", Ts);
            wReq.Headers.Add("Sign", Sign);

            System.Net.WebResponse wResp = wReq.GetResponse();
            System.IO.Stream respStream = wResp.GetResponseStream();

            using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream, Encoding.UTF8))
            {
                string res= reader.ReadToEnd();
            }

(2)服务器端验证参数,参数验证写在BaseApiController.cs文件中,只要继承该类的都可以验证客户端传过来的参数

 public class ValuesController : BaseApiController
    {

        // GET api/values
        public IEnumerable<string> Get(string StatusID,string CarID,string CityID,string name, string key)
        {
            return new string[] { "value1", "value2" };
        }

 BaseApiController

大家可以加我的QQ:530439142,一起交流成长

WebApi与手机客户端通信安全机制 Eric.Chen 2015-10-20 18:23 阅读:758 评论:7

WebApi 服务监控 Eric.Chen 2015-01-22 11:28 阅读:1553 评论:2

webAPI 自动生成帮助文档 Eric.Chen 2014-08-22 10:50 阅读:1256 评论:4

MVC4+WebApi+Redis Session共享练习(下) Eric.Chen 2013-08-09 21:49 阅读:2156 评论:1

MVC4+WebApi+Redis Session共享练习(上) Eric.Chen 2013-08-08 20:41 阅读:3992 评论:12

时间: 2024-10-04 05:57:56

WebApi与手机客户端通信安全机制的相关文章

腾讯通RTX 2013 正式版许可高级自定义服务【支持手机客户端】

最新版本高级自定义服务后支持手机客户端(安卓和苹果智能手机) 手机客户端支持两套插件:1.通过总机号间接连接  2.通过服务器端口直接连接 说明:仅此0410版支持手机客户端其他版本均不支持,请购买者认真考虑. 新特性 消息管理器查询时间选项细化,增加两个选项. 群会话加入最近联系人列表,通过最近联系人直接发起群会话. 自定义组允许添加互联企业外部多人会话. 解决消息管理器无法发起互联企业外部单人会话. 群增加屏蔽功能. 外部会话增加屏蔽功能. 对登录是程序界面卡顿进行了优化. 新增会话窗口崩溃

中国最好的外汇平台新增手机客户端让你玩转世界

NordFX公司很高兴向大家推出可以在iPhone和Android操作系统上进行外汇交易的免费应用程序.从现在起,通过 NordFX MT4 iTrader 和 NordFX MT4 droidTrader 应用程序,您就可以使用手机或者平板电脑随时随地接入移动互联网并进行外汇交易! NordFX公司的移动交易应用配备了友好的用户界面,并与功能丰富的MetaTrader4交易平台相结合. 主要功能: 在即时图表上进行实时交易 能够使用所有可用的交易工具 打开买单和卖单 打开挂单 给定单设置止损价

基于Html5的智能家居手机客户端设计(一)——找到openhab的rest

今天开始我的毕业设计,基于HTML5的智能家居手机客户端设计.挑剔了好久,终于找到我可以使用国外开源项目智能家居核心,通过restful(我也不是很懂,毕竟我只是电子信息学院爱好网络). REST描述了一个架构样式的网络系统,比如 web 应用程序.在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量

招商手机客户端功能

Keywords: 招商银行, CMB, 手机客户端, 招行专业版, 转账, 转帐, 汇款, 贵金属, 纸黄金, 纸白银 1. 转账汇款 1.1 功能:可以任意向他人或他行账户转账. 1.2 开通:登录招行专业版,一卡通>功能申请,选择一卡通卡号,转账汇款>转账汇款功能>管理>修改,选择开通“短信验证码转账限额”和“自助设备转账限额”,并设置限额. 1.3 使用:登录手机客户端,一卡通>自主转账>转账汇款. 2. 协议转账 1.1 功能:只能向本人招行账户或在专业版中定

完美高仿精仿京东商城手机客户端android版源码

完美高仿精仿京东商城手机客户端android版源码,喜欢的朋友可以下载吧. 源码下载: http://code.662p.com/view/4876.html AndroidManifest.xml <?xml version="1.0" encoding="utf-8" ?> - <manifest android:versionCode="6952" android:versionName="2.7.0"

GPS部标平台的架构设计(六)-Android手机客户端和手机查车设计

对于GPS软件平台,虽然有功能非常丰富的PC端或BS客户端,但是客户也是需要移动客户端来作为自己的辅助工具,也是需要的.做为GPS平台的设计者和开发者,在开发移动客户端的时候,也需要从常规的服务器开发和客户端开发的思维中,转变过来,当然客户的需求也需要转变,因为毕竟不能随心所欲的将PC端的所有功能需求照搬到手机客户端,手机的开发环境.网络环境.使用环境都决定了设计理念与PC端的设计是完全不一样的. 通常我们成为GPS部标平台的手机客户端为手机查车,实际上现在的功能不仅仅是查车,由于客户需求的推进

PHP判断是否为手机客户端

<? function check_wap(){ if(stristr($_SERVER['HTTP_VIA'],"wap")){// 先检查是否为wap代理,准确度高 return true; }elseif(strpos(strtoupper($_SERVER['HTTP_ACCEPT']),"VND.WAP.WML") > 0){// 检查浏览器是否接受 WML. return true; }elseif(preg_match('/(blackbe

【WP 8.1开发】手机客户端应用接收推送通知

上一篇文章中,已经完成了用于发送通知的服务器端,接下来我们就用这个服务端来测试一下. 在开始测试之前,我们要做一个接收通知的WP应用. 1.启动VS Express for Windows,新建项目,在项目模板中选择“空白应用程序(Windows Phone)”. 2.既然要接收通知,肯定少不了Toast.磁贴这几样常用的通知的,故我们得先准备一些图片. 在“解决方案资源管理器”中,双击打开清单文件,切换到“可见资产”选项卡,这个“资产”指的不你的银行卡存款有多少,而是你的应用中的一些如图片.音

基于react-native实现的博客园手机客户端

从五月初开始,中间抽出断断续续的业余时间,基于react-native,在博客园现有开放接口的基础上,实现了一个博客园手机客户端.由于博主没有ios开发环境,所以当前仅适配了android版本.出于学习和实践react-native的目的,UI呈现这一块完全凭自己所好,bug也有一些,更多是希望抛砖引玉,让大家感受到react/react-native为移动端开发带来的全新视觉和可能性. 一,相关链接1,react-nativehttps://github.com/facebook/react-