原創(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加固除了本身支持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
反解密一文。珊佣、
閱讀推薦
第一時間獲取android技術(shù)文章請關(guān)注我的公眾號蹋宦!