編輯:關於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; } }
前面學習總結了平時開發中遇見的各種數據加密方式,最終都會對加密後的二進制數據進行Base64編碼,起到一種二次加密的效果,其實呢Base64從嚴格意義上來說的話不是一種加
單元測試TestCaseAndroid的sdk提供了對項目進行單元測試的功能,開發包的android.test下面便是專門用來單元測試的類。單元測試的作用是通過模擬文本輸
Android圖表庫MPAndroidChart(十三)——簡約的底部柱狀圖。我們繼續上一講,今天還是說下柱狀圖,這個圖的話應該是用的比較多的,所
Sharing Simple DataOne of the great things about Android applications is their abilit