本文介紹了為您的Android應用整合WAF App防護SDK(以下簡稱SDK)的操作方法。您必須在應用中整合SDK,才能為應用開啟App防護。
使用限制
Android應用的API版本必須是16及以上,否則無法正常使用SDK。
前提條件
已開通WAF App防護模組且開啟了App防護狀態開關。
相關操作,請參見如何為應用開啟App防護。
已擷取Android應用對應的SDK。
您開通WAF App防護模組後,請提交工單,聯絡產品技術專家擷取SDK。
Android應用對應的SDK包含1個AAR檔案,檔案名稱為AliTigerTally_X.Y.Z.aar,其中X.Y.Z表示版本號碼。
已擷取SDK認證密鑰(即
appkey
)。您在Web Application Firewall控制台的 頁面開啟App防護後,即可單擊擷取並複製appkey,擷取SDK認證密鑰。該密鑰用於發起SDK初始化請求,需要在整合代碼中使用。
說明每個阿里雲帳號擁有唯一的
appkey
(適用於所有接入WAF防護的網域名稱),且Android和iOS應用整合SDK時都使用該appkey
。認證密鑰樣本:
****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****
背景資訊
App防護SDK主要用於對通過App用戶端發起的請求進行簽名。WAF服務端通過校正App請求籤名,識別App業務中的風險、攔截惡意請求,實現App防護的目的。
建立一個測試工程(可選)
您可以直接在真實的Android工程中整合SDK,或者先建立一個測試工程進行測試,等熟悉操作後,再在真實環境中進行操作。
以Android Studio工具為例,建立一個測試用Android工程,並按照設定精靈完成建立。
本文將測試工程命名為TigerTally_sdk_test,建立好的工程目錄如下圖所示。在整合SDK前,請確認測試工程可以正常運行。
操作步驟
使用Android Studio開啟App工程,進入檔案目錄。
引用AAR包。
將您擷取的AliTigerTally.aar檔案複製到libs目錄(可以直接拖放進去)。
開啟build.gradle檔案,修改以下配置:
將libs目錄添加為尋找依賴的源。
repositories{ flatDir { dirs 'libs' } }
添加編譯依賴。
重要您需要將以下代碼中AliTigerTally檔案的版本號碼(X.Y.Z)替換成您擷取的AAR檔案的版本號碼。
dependencies { compile(name: 'AliTigerTally_X.Y.Z', ext: 'aar') }
在頁面上方的提示資訊中,單擊Sync Now,將修改的配置同步到專案中。
添加SO引用。
如果您的專案已經使用過SO,請跳過該步驟;如果專案在此之前未使用過SO,請在build.gradle中添加以下配置:
android { defaultConfig { ndk { abiFilters 'arm64-v8a', 'x86', "armeabi-v7a" //abiFilters "armeabi-v7a" } } }
為應用申請以下許可權。
許可權
是否必須
說明
android.permission.INTERNET
是
用於串連網路。
android.permission.ACCESS_NETWORK_STATE
否
用於擷取裝置的網路狀態。
android.permission.ACCESS_WIFI_STATE
否
用於擷取裝置的WIFI狀態。
android.permission.READ_PHONE_STATE
否
用於讀取裝置狀態和身份。
重要該許可權在Android 6.0及以上需要動態申請。
android.permission.BLUETOOTH
否
用於擷取裝置的藍芽許可權。
android.permission. READ_EXTERNAL_STORAGE
否
用於讀取裝置的外部儲存。
重要該許可權在Android 6.0及以上需要動態申請。
android.permission.CHANGE_NETWORK_STATE
否
用於修改裝置的網路狀態。
添加整合代碼。
設定使用者標識。
介面定義:
int setAccount(String account);
功能:設定您業務中自訂的終端使用者標識,方便您更靈活地配置WAF防護策略。
介面參數:<account>,String類型,表示標識一個使用者的字串(建議您使用脫敏後的格式)。
傳回值:int類型,返回是否設定成功,0表示成功,-1表示失敗。
範例程式碼:
final String account="account"; TigerTallyAPI.setAccount(account); // 如果當前登入的使用者是遊客身份,可以跳過這步,直接調用初始化函數。
SDK初始化。
介面定義:
int init(Context context, String appkey, int type);
功能:初始化SDK,執行一次初始化採集。一次初始化採集表示採集一次終端裝置資訊,您可以根據業務的不同,重新調用
init
函數進行初始化採集。初始化採集分為兩種模式:採集全量資料、採集除需授權欄位外的資料(不採集涉及終端裝置使用者隱私的欄位,包括:imei、imsi、simSerial、wifiMac、wifiList、bluetoothMac)。
說明建議您在終端使用者同意App的隱私政策前,採集除需授權欄位外的資料;在終端使用者同意App的隱私政策後,再採集全量資料。採集全量資料有利於更好地識別風險。
介面參數:
<context>:Context類型,傳入您應用的上下文。
<appkey>:String類型,設定為您的SDK認證密鑰。
<type>:CollectType類型,設定採集模式。取值:
DEFAULT:表示採集全量資料。
NO_GRANTED:表示採集除需授權欄位外的資料。
傳回值:int類型,返回初始化結果,0表示成功,-1表示失敗。
範例程式碼:
final String appkey="your_appkey"; // 採集全量資料。 int ret = TigerTallyAPI.init(this.getApplicationContext(), appkey, TigerTallyAPI.CollectType.DEFAULT); // 採集除需授權欄位外的資料。 int ret = TigerTallyAPI.init(this.getApplicationContext(), appkey, TigerTallyAPI.CollectType.NOT_GRANTED); Log.d("AliSDK", "ret:" + ret);
簽章要求資料。
介面定義:
String vmpSign(int signType, byte[] input);
功能:對輸入的資料進行簽名,並且返回簽名串。
介面參數:
<signType>:int類型,取值固定為1,表示預設的簽名演算法。
<input>:byte[]類型,表示待簽名的資料。
待簽名資料一般是整個請求體(RequestBody)。 如果請求體為空白(例如,POST請求的Body為空白或者使用了GET請求),則設定成Null 物件(
null
)或者Null 字元串的Bytes值(例如,"".getBytes("UTF-8")
)。
傳回值:String類型,返回簽名串。
範例程式碼:
說明範例程式碼中將簽名串定義為wToken。
String request_body = "i am the request body, encrypted or not!"; String wToken = null; try { wToken = TigerTallyAPI.vmpSign(1, request_body.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } Log.d("AliSDK", "wToken:" + wToken);
將簽名串添加到HTTP協議頭。
例如,如果您的專案使用
HttpURLConnection
,則可以將簽名串(wToken)欄位的內容添加到HttpURLConnection
類的對象中。範例程式碼:
String request_body = "i am the request body, encrypted or not!"; new Thread(new Runnable() { @Override public void run() { try { URL url = new URL("https://www.aliyundoc.com"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(5000); conn.setRequestMethod("POST"); // set wToken info to header conn.setRequestProperty("wToken", wToken); OutputStream os = conn.getOutputStream(); // set request body info byte[] requestBody = request_body.getBytes("UTF-8"); os.write(requestBody); os.flush(); os.close(); int code = conn.getResponseCode(); Log.d("respCode", Integer.toString(code)); } catch (MalformedURLException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }; }).start();
將修改好HTTP協議頭的資料發送到應用伺服器。
WAF服務端獲得應用伺服器收到的請求後,通過解析簽名串(wToken)進行風險識別、攔截惡意請求,然後將合法請求轉寄回來源站點。
介面混淆配置
如果您使用ProGuard進行代碼混淆,則可以使用-keep
選項對SDK的介面函數進行設定,保護SDK介面函數不被移除混淆。
範例程式碼:
-keep class com.aliyun.TigerTally.* {*;}