Retrofit/Okhttp API接口加固技術(shù)實踐(上)

原創(chuàng)作者:Tamic
地址:http://www.reibang.com/u/3bbb1ddf4fd5

寫這篇文章凌蔬,我糾結(jié)了很久炫掐,到底是屬于app安全系列潭苞,還是屬于Retrofit系列庶诡,最終我還是選擇了將本篇文章歸類到Retrofit下唬血。

對于retrofit安全相關(guān)的剛開始就寫了一篇《Retrofit 2.0 超能實踐(一)响逢,okHttp完美支持Https傳輸》(http://blog.csdn.net/sk719887916/article/details/51597816绒窑, 文章介紹了怎么使用Retrofit,并且在遇到okhttps的使用方式舔亭,但對于加密我們還是無法了解太多些膨,對于安全性要求很高的接口場景還是無法滿足,今天就來介紹下對普通api參數(shù)的加密分歇!

APP基本安全的文章以前擼了一篇App安全(一) Android防止升級過程被劫持和換包傀蓉,后續(xù)沒有再繼續(xù)跟進(jìn),今年會加重安全這塊的文章职抡。 主要說下支付寶為代表的用的安全策略技術(shù)葬燎,本篇介紹下API加固的常用技術(shù)。常用的模式是加密-認(rèn)證身份-鑒別權(quán)限-解密過程缚甩。

API加固.png

Api加固除了本身支持Https谱净,還會額外進(jìn)行上圖中一系列的加密策略,自定義對Resquest/Response Data進(jìn)行加密擅威,對url加密壕探,甚至對request進(jìn)行校驗等。如果你加入RxJava操作符做一系列的加密流程郊丛,那將是錦上添花李请。解密過程也直接使用RxJava ,map操作符轉(zhuǎn)換解密后返回給業(yè)務(wù)層厉熟,RxJava之前也介紹過好幾篇导盅,這里不再安利。

加固API主要由四種方案:

  • 使用Https
  • URL加密
  • 參數(shù)加密
  • 加入權(quán)限
  • 時效驗證
  • 數(shù)字簽名

Https

以前寫過一篇文章可以參考 :Retrofit 2.0 超能實踐(一)揍瑟,完美支持加密Https傳輸

URL加密

只針對普通get請求白翻,不針對post表單提交及ajax方式
策略:對于暴露在瀏覽器地址欄中的地址進(jìn)行加密,如一個屬性為name=tamic绢片,
假設(shè)對tamic加密后為kadfxarf24saa:
假設(shè)真實值在這段字符中間滤馍,那么我們可以對前三位進(jìn)行隨機岛琼,后三位隨機,
再對真實的tamic進(jìn)行加密轉(zhuǎn)換(base64都行)巢株,然后再來個倒序槐瑞,那么剩下的數(shù)字我們可以獲取當(dāng)前時間追加,最后再進(jìn)行md5都行纯续,這樣普通的用戶無法感知具體路徑真實值是什么随珠,甚至一般黑客都無法輕易解析具體內(nèi)容,服務(wù)端拿到具體值的策略也是一樣

只要按約定的好的算法進(jìn)行解碼就行了猬错。這樣不僅能防止惡意程序請求我們的服務(wù)端窗看。而且還能對具體的參數(shù)地址進(jìn)行加密。

參數(shù)加密

參數(shù)加密一般針對表單中的字段和值進(jìn)行加密倦炒,防止中途第三方進(jìn)行窺探和篡改显沈。一般我們可以用okhttp的Interceptor 進(jìn)行處理。 可以在發(fā)動報文前逢唤,對參數(shù)進(jìn)行加密轉(zhuǎn)碼拉讯。

案列:

public class EncryptionInterceptor implements Interceptor {

  private static final String TAG = EncryptionInterceptor.class.getSimpleName();

  private static final boolean DEBUG = true;

   @Override
   public Response intercept(Chain chain) throws IOException {


   Request request = chain.request();
   RequestBody oldBody = request.body();
   Buffer buffer = new Buffer();
   oldBody.writeTo(buffer);
   String strOldBody = buffer.readUtf8();
   MediaType mediaType = MediaType.parse("text/plain; charset=utf-8");
   String strNewBody = CodeMachine.encrypt(strOldBody);
   RequestBody body = RequestBody.create(mediaType, strNewBody);
   request = request.newBuilder().header("Content-Type", body.contentType().toString()).header("Content-Length", String.valueOf(body.contentLength())).method(request.method(), body).build();
   return chain.proceed(request);
}}

加密算法自己和服務(wù)端約定即可

private static String encrypt(String ){
  //your code
}

add到client即可

client = new OkHttpClient.Builder()
.addNetworkInterceptor(new  EncryptionInterceptor()).build();
retrofit = new Retrofit.Builder().client(client).build();

服務(wù)端代碼也是拿到具體參數(shù)進(jìn)行同步的加密算法來進(jìn)行反解密。

這種加密只是比較簡單的對稱加密鳖藕,如果要想提高破解難度請使用非對稱加密算法

加入權(quán)限

權(quán)限控制也是對接口加密的一種業(yè)務(wù)層策略魔慷,比如一個電商APP,有商戶著恩,有用戶院尔,有中間物流商,還有中間服務(wù)商喉誊,那么同一個獲取商品信息的權(quán)限不同的邀摆,商家有修改商品信息的權(quán)限,用戶只能瀏覽查看的功能伍茄,物流商可以有指定物流渠道權(quán)限栋盹,中間服務(wù)商可以擁有協(xié)調(diào)監(jiān)督功能,如歸有涉及假冒敷矫,法律的可以強制下架改商品例获,那么是同樣一個getProductInfo接口 卻又不同的信息,那么這個接口定義的時候曹仗,服務(wù)端和移動端就已經(jīng)商討好了協(xié)議榨汤,賦予不同角色權(quán)限.

 public enum Permission {

  User,
  Shop,
  Courier,
  Platform
}

如上展示了四種角色控制,不同角色Server返回的數(shù)據(jù)Module也是不同的整葡。 遇到三方惡意攻擊件余,服務(wù)端確定并客戶端發(fā)來的權(quán)限并不是我們固定的角色讥脐,那么服務(wù)端也將視這次請求為無效的遭居。

時效驗證

時效驗證一般是用來校驗API是否過期啼器,業(yè)內(nèi)常用來做訂單是否重復(fù)的依據(jù)之一。比如用戶在某個購物網(wǎng)站下單買東西時俱萍,就會生成下單的時間毫秒數(shù)端壳,服務(wù)端拿到這個下單(Request)動作的網(wǎng)絡(luò)請求,會檢驗這個時間是否過期枪蘑,如果時間差值大于規(guī)定的值损谦,就可視這個訂單被中途篡改過,或者過期岳颇,比如一秒內(nèi)重復(fù)從一個客戶端發(fā)兩個請求(Request)照捡,服務(wù)端(server)拿到時間發(fā)現(xiàn)已經(jīng)存在一個,就不再處理第二個訂單信息话侧,提示用戶不要重復(fù)提交栗精。

一般時間值參數(shù),不會單純的在請求中單一傳輸瞻鹏,一般采用某種算法把客戶端的時間戳 加密成一定字符后悲立,在進(jìn)行發(fā)送到SERVICE.這種策略對于重復(fù)惡意刷單,有很好的防御作用新博。支付寶付款實則也是用的這種策略薪夕,時間閥值大約3s左右。

數(shù)字簽名

每個Request也應(yīng)該有響應(yīng)的數(shù)字簽名赫悄,這個簽名不同于SSL機制的中的簽名原献,只是Client和server約定的一種自簽名方式,額外校驗Request數(shù)據(jù)有沒有被篡改過涩蜘,也可以稱之為每個Request有一定的唯一區(qū)分符-ID,簽名算法可能很復(fù)雜嚼贡,一般依據(jù)本地設(shè)備ID,UserID,UUID同诫,Token粤策,綜合進(jìn)行計算,本質(zhì)其實就是加密误窖,附帶給Request叮盘。

總結(jié)

通過以上Retrofit的api加密列子。在客戶端api加固中霹俺,常用上面這幾種綜合來實現(xiàn)柔吼,做到萬無一失,從數(shù)據(jù)源的加密丙唧,到傳輸過程中加密愈魏,到數(shù)據(jù)源獲取到權(quán)限的校驗,整個過程都是做了防御的,如過需要給第三方提供接口認(rèn)證培漏, 可以使用授權(quán)溪厘,類似微信提供給你的三方登錄一樣,詳情可以參考:OAuth 工作原理牌柄,那么很多時候我們也要對服務(wù)端返回的數(shù)據(jù)進(jìn)行校驗解密畸悬,后續(xù)帶來對response反解密一文。珊佣、

閱讀推薦

App安全(一) Android防止升級過程被劫持和換包H

原文:http://www.reibang.com/p/0d7518849436

第一時間獲取android技術(shù)文章請關(guān)注我的公眾號蹋宦!

開發(fā)者技術(shù)前線
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咒锻,隨后出現(xiàn)的幾起案子冷冗,更是在濱河造成了極大的恐慌,老刑警劉巖惑艇,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贾惦,死亡現(xiàn)場離奇詭異,居然都是意外死亡敦捧,警方通過查閱死者的電腦和手機须板,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兢卵,“玉大人习瑰,你說我怎么就攤上這事』嗷纾” “怎么了甜奄?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窃款。 經(jīng)常有香客問我课兄,道長,這世上最難降的妖魔是什么晨继? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任烟阐,我火速辦了婚禮,結(jié)果婚禮上紊扬,老公的妹妹穿的比我還像新娘蜒茄。我一直安慰自己,他們只是感情好餐屎,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布锣杂。 她就那樣靜靜地躺著工育,像睡著了一般呢堰。 火紅的嫁衣襯著肌膚如雪机久。 梳的紋絲不亂的頭發(fā)上空扎,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音润讥,去河邊找鬼勺卢。 笑死,一個胖子當(dāng)著我的面吹牛象对,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宴抚,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼勒魔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了菇曲?” 一聲冷哼從身側(cè)響起冠绢,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎常潮,沒想到半個月后弟胀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡喊式,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年孵户,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岔留。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡夏哭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出献联,到底是詐尸還是另有隱情竖配,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布里逆,位于F島的核電站进胯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏原押。R本人自食惡果不足惜胁镐,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诸衔。 院中可真熱鬧希停,春花似錦、人聲如沸署隘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽磁餐。三九已至违崇,卻和暖如春阿弃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背羞延。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工渣淳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伴箩。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓入愧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嗤谚。 傳聞我的和親對象是個殘疾皇子棺蛛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容