Android数据传输增加签名认证(防止数据被篡改)

我们开发的客户端项目,跟服务器通信的时候,一般都是HTTP明文的形式进行的,这样的数据很容易被别人截取,如果被截取的信息是比较敏感的数据,并且数据没有进行加密,被随意的篡改成,那后果不堪设想。还好,目前来说有比较好的签名算法,下面是PHP版本的(微信数据验证就是用下面的方法):

算法的原理是这样的:假设我们请求的网址是,要传过去的数据是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;}}

真正的寂寞是在人群中,当你面对许多熟悉的脸,

Android数据传输增加签名认证(防止数据被篡改)

相关文章:

你感兴趣的文章:

标签云: