Android数据传输增加签名认证(防止数据被篡改)
我们开发的客户端项目,跟服务器通信的时候,一般都是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版本的:
<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; } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。