热门标签 | 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等加密算法。希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
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社区 版权所有