您的位置:首页 > 移动开发 > Android开发

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版本的:

<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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐