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;
    	}  
    }


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。