編輯:關於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版本的:
/**
* 作用:格式化參數,簽名過程需要使用
*/
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;
}
/**
* 作用:生成簽名
*/
public function getSign($Obj)
{
foreach ($Obj as $k => $v)
{
$Parameters[$k] = $v;
}
//簽名步驟一:按字典序排序參數
ksort($Parameters);
$String = formatBizQueryParaMap($Parameters, false);
//echo '【string1】'.$String.'
';
//簽名步驟二:在string後加入KEY
$String = $String."&key=".Config::KEY;
//echo "【string2】".$String."
";
//簽名步驟三:MD5加密
$String = md5($String);
//echo "【string3】 ".$String."
";
//簽名步驟四:所有字符轉為大寫
$result_ = strtoupper($String);
//echo "【result】 ".$result_."
";
return $result_;
}
public static> List asSortedList(Collection c) { List list = new ArrayList (c); java.util.Collections.sort(list); return list; } public static String formatBizQueryParaMap(Map paraMap) { Set keys = paraMap.keySet(); List 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 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數據加密之Base64編碼算法的簡單實現
前面學習總結了平時開發中遇見的各種數據加密方式,最終都會對加密後的二進制數據進行Base64編碼,起到一種二次加密的效果,其實呢Base64從嚴格意義上來說的話不是一種加
Android開發筆記(一百一十三)測試工具
單元測試TestCaseAndroid的sdk提供了對項目進行單元測試的功能,開發包的android.test下面便是專門用來單元測試的類。單元測試的作用是通過模擬文本輸
Android圖表庫MPAndroidChart(十三)——簡約的底部柱狀圖
Android圖表庫MPAndroidChart(十三)——簡約的底部柱狀圖。我們繼續上一講,今天還是說下柱狀圖,這個圖的話應該是用的比較多的,所
Android doc譯文|Building Apps with Content Sharing|Sharing Simple Data
Sharing Simple DataOne of the great things about Android applications is their abilit