热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android网络请求-sign参数的设置方式

这篇文章主要介绍了Android网络请求-sign参数的设置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

最近做项目,碰着一个奇怪的请求,后台说在调用接口之前需要验证签名和有效时间,当场就懵逼了,要生成一个sign签名,下面来说说怎么做

首先说说大致思路: sign 的生成:按照规则来是键值对的形式(key=value),拼接的时候按照key=value&key=value(注意:key:后台所需的参数名,value:前台所获取到的值)&time=系统所获取的时间&salt = fangzhou(这个参数按照后台要求),而后进行 urlencode 编码(Java中有方法),下一步进行MD5加密,如果需要将加密后的值全部转化为大写(小写),Java中有方法直接调用即可;

接下来说说具体怎么实现:

1.请求数值的拼接(key=value&key=value):

String name = "宋小宝";
String address = "东北";
String panameter = "name="+ name + "& address = "+address;

2.在请求数值的拼接字符串后面加上时间戳和特定值(根据后台要求来)

//获取系统时间戳
Date dt= new Date();
Long timeStamp= dt.getTime();
String signText = panameter +"&time="+timeStamp + "&salt=fangzhou";

3.拼接完成后,对signText进行 urlencode 编码

try {
 String urlencoderText = URLEncoder.encode(signText,"utf-8");
} catch (UnsupportedEncodingException e) {
 e.printStackTrace();
}

注:这里会抛出一个异常,直接 try 就可以了,这只是一个Java方法直接调用就完毕了

4.然后进行md5加密

//MD5加密
String md5Text = md5(urlencoderText);

md5加密的方法了,网上有,直接c,v就ok了;

如果要对加密后的值,字母全部转化为大写(小写)直接这样:

//MD5加密
String md5Text = md5(urlencoderText).trim().toUpperCase();

注:这是转化为大写的方法(小写的方法:直接在字符串后面这样加就可以了

.trim().toLowerCase();

这样就可以了;但是你以为这样就完了? 哥们儿,你想的太简单了;下面才是最坑...的时候,怎么形容了,直接上代码吧!

首先说明一点我用的xutils请求框架(具体怎么用我就不说了,相信大家都会用的-中国的程序猿是最棒的);

//设置请求地址
params = new RequestParams(url);

//添加请求参数
params.addBodyParameter("name",name);
params.addBodyParameter("address",address);
//---添加时间戳---
params.addBodyParameter("time",timeStamp+"");

//加密的参数-sign
params.addBodyParameter("sign",md5Text );

看见没有,没有进行转码的请求参数,照样去添加,一个都不能少,反而还多了一个时间戳的参数,但是注意我上面加密了salt请求参数,这里没有添加!!在最后面添加了转码加密后的请求参数-sign

而后就用正常的发请求的流程就可以啦,,,就是这样--完美

总之一句话-先拼接-后转码-再加密-再发请求

补充知识:浅谈URL参数的sign签名认证

以下内容是参考别人的博客内容整理,如有不足之处,敬请指正。。。

大家先思考一个问题: 你在写开放的API接口时是如何保证数据的安全性的?

先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题,例如:

1. 请求来源(身份)是否合法?

2. 请求参数被篡改?

3. 请求的唯一性(不可复制)

解决方案:为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证。

案列分析

我们通过给某 [移动端(app)] 写 [后台接口(api)] 的案例进行分析:

客户端:以下简称app

后台接口:以下简称api

我们通过app查询产品列表这个操作来进行分析:

app中点击查询按钮==》调用api进行查询==》返回查询结果==>显示在app中

一、不进行验证的方式

api查询接口:

app调用:http://api.test.com/getproducts?参数1=value1.......

如上,这种方式简单粗暴,通过调用getproducts方法即可获取产品列表信息了,但是这样的方式会存在很严重的安全性问题,没有进行任何的验证,大家都可以通过这个方法获取到产品列表,导致产品信息泄露。

那么,如何验证调用者身份呢?如何防止参数被篡改呢?

二、MD5参数签名的方式

我们对api查询产品接口进行优化:

1.给app分配对应的key、secret

2.Sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下:

a. 按照请求参数名称将所有请求参数按照字母先后顺序排序得到:keyvaluekeyvalue...keyvalue 字符串如:将arOng=1,mrOng=2,crOng=3 排序为:arOng=1, crOng=3,mrOng=2 然后将参数名和参数值进行拼接得到参数字符串:arong1crong3mrong2。

b. 将secret加在参数字符串的头部后进行MD5加密 ,加密后的字符串需大写。即得到签名Sign

新api接口代码:

app调用:http://api.test.com/getproducts?key=app_key&sign=BCC7C71CF93F9CDBDB88671B701D8A35&参数1=value1&参数2=value2.......

注:secret 仅作加密使用, 为了保证数据安全请不要在请求参数中使用。

如上,优化后的请求多了key和sign参数,这样请求的时候就需要合法的key和正确签名sign才可以获取产品数据。这样就解决了身份验证和防止参数篡改问题,如果请求参数被人拿走,没事,他们永远也拿不到secret,因为secret是不传递的。再也无法伪造合法的请求。

但是...这样就够了吗?细心的同学可能会发现,如果我获取了你完整的链接,一直使用你的key和sign和一样的参数不就可以正常获取数据了...-_-!是的,仅仅是如上的优化是不够的。。。。。。

请求的唯一性:

为了防止别人重复使用请求参数问题,我们需要保证请求的唯一性,就是对应请求只能使用一次,这样就算别人拿走了请求的完整链接也是无效的。

唯一性的实现:在如上的请求参数中,我们加入时间戳:timestamp(yyyyMMddHHmmss),同样,时间戳作为请求参数之一,也加入sign算法中进行加密。

新的api接口:

app调用:

http://api.test.com/getproducts?key=app_key&sign=BCC7C71CF93F9CDBDB88671B701D8A35×tamp=201603261407&参数1=value1&参数2=value2.......

如上,我们通过timestamp时间戳用来验证请求是否过期。这样就算被人拿走完整的请求链接也是无效的。

Sign签名安全性分析:

通过上面的案例,我们可以看出,安全的关键在于参与签名的secret,整个过程中secret是不参与通信的,所以只要保证secret不泄露,请求就不会被伪造。

总结

上述的Sign签名的方式能够在一定程度上防止信息被篡改和伪造,保障通信的安全,这里使用的是MD5进行加密,当然实际使用中大家可以根据实际需求进行自定义签名算法,比如:RSA,SHA等加密算法。希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 泛圈企业云盘:打造高效灵活的协同平台提高企业办公效率
    云计算作为一种新的模式,给企业信息化的发展带来了巨大的变化。其中,企业云盘是一种可以快速被接受的企业云应用,因为在企业云盘存储中,所有云服务带来的风险都会大大降低。将文档管理系统本 ... [详细]
  • Java的核心库提供了大量的现成的类供我们使用。本节我们介绍几个常用的工具类。Math顾名思义,Math类就是用来进行数学计算的,它提供了大量的静态 ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • IT管理类培训,你想了解的全都在这里
    IT类的培训,主要分为技术类和管理类。不断有小伙伴问起各种培训的价值,内容和对自己职业发展的帮助,希望这篇帖子可以给大家一些启发。首先用 ... [详细]
  • 局限性_Scrum框架的局限性
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Scrum框架的局限性相关的知识,希望对你有一定的参考价值。在很多工作坊的讨论中, ... [详细]
  • 摘要:本文中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务在读者正在工作的 ... [详细]
  • lora物联网开发教程(物联网lora特点)
    长距离星型架构,由于长距离连接性,从而减少了电池寿命。这个协议采用了阿罗哈法。在一个网状网络或者一个异步网络中,例如蜂窝网,结点必须频繁的被唤醒,来同步网络和检查消息。这种同步,大 ... [详细]
  • PHPcURL获取微信公众号access_token的实例php实例:这篇文章主要介绍了PHPcURL获取微信公众号access_token的实例,需要的朋友可以参考下1.开发微信 ... [详细]
  • 编程语言是从哪蹦出来的——大型伦理寻根现场
    Hello,我是Alex007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫Alex的人太多了,再加上每天007的生活,Alex007就诞生了。聊一聊编程到底是啥,怎 ... [详细]
  • Linux负载均衡LVS(IPVS)
    一、LVS简介LVS是LinuxVirtualServer的简称,也就是Linux虚拟服务器,是一个由章文嵩博士发起的自由软件项目,现在已经是Linux ... [详细]
  • 算法:程序运行的次数O(1):常数复杂度printf(helloworld);O(logn):对数复杂度for(inti1;i ... [详细]
  • 在实际开发中,现在安卓端和后台之间的数据交互,一般都是用JSON来传递数据信息。JSON大家一般都比较熟悉。我这边就以实际项目中的后台传过来的情况和大家分析下及如何处理。比如后台返 ... [详细]
  • EIGRP增强内部网关路由协议协议号88IGRPEIGRP都是CISCO的私有协议.---高级距离矢量协议1、是唯一的一种LSDV的混合协议2、EIGRP拥有目前最快的网络路由收敛 ... [详细]
  • jquery popupDialog 使用 加载jsp页面办法
    php教程|PHP开发jqueryphp教程-PHP开发如下所示:软件市场源码,vsCode字体不变,ubuntu的所有版本,taotomcat,sqlite连接php,个人域名服 ... [详细]
  • IT运维管理困境
    四大利器帮你走出IT运维管理的困境2008-10-0717:27:05标签:IT运维管理网络拓扑图   [推送到技术圈]最近给客户做咨询时,跟行业客户谈 ... [详细]
author-avatar
天辰Tcqq
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有