Android数据传输增加签名认证(防止数据被篡改)
2015-03-26 16:32
357 查看
我们开发的客户端项目,跟服务器通信的时候,一般都是HTTP明文的形式进行的,这样的数据很容易被别人截取,如果被截取的信息是比较敏感的数据,并且数据没有进行加密,被随意的篡改成,那后果不堪设想。还好,目前来说有比较好的签名算法,下面是PHP版本的(微信数据验证就是用下面的方法):
算法的原理是这样的:假设我们请求的网址是http://xxxx.com,要传过去的数据是username=bb, action=buy, gid=10这三个购买逻辑的参数,我们该如何对这个数据进行签名呢?首先,我们客户端要有一个跟服务器相同的key(密钥),key是打死都不能告诉别人的!用这个key我们生成一个sign(签名),签名算法是:
sign = md5("username="+bb+"&"+"action="+buy+"&gid="+10"+key)
然后我们把username,action,gid,sign一同传过去,服务器那边进行解析我们传过去的参数,然后用上面相同的算法,生成sign_new,跟我们传过去的sign进行对比,如果相同,说明数据没有被篡改,如果不同,说明数据被改动过,不合法,该操作被拒绝!
光说不上代码的,那都是耍流氓···好,废话不说了,下面是PHP版本的:
下面是android版本的:
算法的原理是这样的:假设我们请求的网址是http://xxxx.com,要传过去的数据是username=bb, action=buy, gid=10这三个购买逻辑的参数,我们该如何对这个数据进行签名呢?首先,我们客户端要有一个跟服务器相同的key(密钥),key是打死都不能告诉别人的!用这个key我们生成一个sign(签名),签名算法是:
sign = md5("username="+bb+"&"+"action="+buy+"&gid="+10"+key)
然后我们把username,action,gid,sign一同传过去,服务器那边进行解析我们传过去的参数,然后用上面相同的算法,生成sign_new,跟我们传过去的sign进行对比,如果相同,说明数据没有被篡改,如果不同,说明数据被改动过,不合法,该操作被拒绝!
光说不上代码的,那都是耍流氓···好,废话不说了,下面是PHP版本的:
<span style="white-space:pre"> </span>/** * 作用:格式化参数,签名过程需要使用 */ function formatBizQueryParaMap($paraMap, $urlencode) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if($urlencode) { $v = urlencode($v); } //$buff .= strtolower($k) . "=" . $v . "&"; $buff .= $k . "=" . $v . "&"; } $reqPar; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff)-1); } return $reqPar; } <span style="white-space:pre"> </span>/** * 作用:生成签名 */ public function getSign($Obj) { foreach ($Obj as $k => $v) { $Parameters[$k] = $v; } //签名步骤一:按字典序排序参数 ksort($Parameters); $String = formatBizQueryParaMap($Parameters, false); //echo '【string1】'.$String.'</br>'; //签名步骤二:在string后加入KEY $String = $String."&key=".Config::KEY; //echo "【string2】".$String."</br>"; //签名步骤三:MD5加密 $String = md5($String); //echo "【string3】 ".$String."</br>"; //签名步骤四:所有字符转为大写 $result_ = strtoupper($String); //echo "【result】 ".$result_."</br>"; return $result_; }
下面是android版本的:
<span style="white-space:pre"> </span>public static <T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) { List<T> list = new ArrayList<T>(c); java.util.Collections.sort(list); return list; } public static String formatBizQueryParaMap(Map<String,String> paraMap) { Set<String> keys = paraMap.keySet(); List<String> sorted = asSortedList(keys); StringBuffer buffer=new StringBuffer(); for(String key : keys){ buffer.append(key+"="+paraMap.get(key)+"&"); } String result = ""; if (buffer.length() > 0) { result = buffer.substring(0, buffer.length()-1); } return result; } /** * 作用:生成签名 */ public static String getSign(Map<String,String> paraMap) { String params = formatBizQueryParaMap(paraMap); params = params+"&key="+"11111"; String md5 = toMD5(params.getBytes()); return md5.toUpperCase(); } public static String toMD5(byte[] source) { try{ MessageDigest md = MessageDigest.getInstance("MD5"); md.update( source ); StringBuffer buf=new StringBuffer(); for(byte b:md.digest()) buf.append(String.format("%02x", b&0xff) ); return buf.toString(); }catch( Exception e ){ e.printStackTrace(); return null; } }
相关文章推荐
- PHP、Java、C#实现URI参数签名算法,确保应用与REST服务器之间的安全通信,防止Secret Key盗用、数据篡改等恶意攻击行为
- Java实现URI参数签名算法,确保应用与REST服务器之间的安全通信,防止Secret Key盗用、数据篡改等恶意攻击行为
- Java实现URI参数签名算法,确保应用与REST服务器之间的安全通信,防止Secret Key盗用、数据篡改等恶意攻击行为
- 对get方式的参数,如何添加签名,防止数据被篡改或泄露
- Java实现URI参数签名算法,确保应用与REST服务器之间的安全通信,防止Secret Key盗用、数据篡改等恶意攻击行为
- Android Http网络数据传输备忘
- android 按住拖动gallery防止马上加载数据导致gallery卡的方法
- Android学习第二天:Intent传输数据、常用控件和Activity生命周期
- 增加改查——android数据库篇二
- Android 2.0上使用蓝牙通信代码片断(服务端、客户端、数据传输)
- android 读取网络在传输数据时的状态
- Android 为【apk】文件签名,增加修改系统时间等权限
- 深入Android【八】 —— Activity间数据传输 推荐
- 深入Android【八】 —— Activity间数据传输
- android 数据传输之JSON
- android 数据传输之JSON
- Delphi实现WebService带身份认证的数据传输
- 深入Android【八】 —— Activity间数据传输
- 深入Android【八】 —— Activity间数据传输
- 深入Android【八】—— Activity间数据传输