閱讀1278 返回首頁    go 技術社區[雲棲]


接口文檔__Android_安全組件教程_移動安全-阿裏雲

1 內容簡介

本文檔針對安全組件的接口使用進行詳細說明,在使用接口前,請先參考接入前準備,接入安全組件。

安全組件的主要接口如下表:

組件 說明
初始化 SecurityInit 負責全局初始化
異常 JAQException 接口調用異常
安全接口 SecuritySignature 安全簽名
SecurityCipher 安全加密
SecurityStorage 安全存儲
SecurityVerification 安全風控
其中:

初始化:負責整個安全組件的同步初始化。

異常:調用初始化或安全接口時,當接口調用失敗時會拋出JAQException異常。JAQException包含錯誤碼,可以用來甄別具體錯誤類型。

安全接口:提供了安全簽名、安全加密和安全存儲三大類接口。其中,安全簽名和安全加密需要使用指定密鑰Key。這裏的“指定密鑰Key”是指,在獲取yw_1222_0335.jpg文件時同時獲得的“密鑰”,如“4bf1c***81ca”。

在使用安全簽名和安全加密時,需要輸入key值的位置,隻需要填入“4bf1c***81ca”。

1.1 安全簽名

安全簽名基於HMAC_SHA1算法和指定密鑰Key對數據進行加簽,在傳輸數據時,可以利用加簽的結果對傳輸數據進行數據校驗。

以下圖為例,在進行轉賬時,無簽名的正常流程為如圖2

無簽名的數據傳輸

(圖2 無簽名的數據傳輸)

但如圖3,攻擊者可以在數據傳輸時對數據進行劫持,並進行偽造或修改:攻擊者進行劫持

(圖3 攻擊者進行劫持)

此時,如圖4,利用簽名對數據進行校驗,劫持者的偽造信息就可以被識別。增加簽名的數據傳輸

(圖4 增加簽名的數據傳輸)

1.2 安全加密

安全加密基於AES128算法和指定密鑰Key對輸入數據進行加密,加密過程完全在Native層實現,速度更快,較Java方法更加安全。

普通Java加密和聚安全加密相關對比,請參看下表:

項目 普通加密 聚安全安全加密
速度
密鑰 存於Java代碼中易被破解 加密存儲在加密存儲在yw_1222_0335.jpg文件中,使用沙箱保護,不直接暴露在代碼中
安全性 不校驗APK簽名,易被重打包 校驗APK簽名,攻擊者重打包後無法直接使用

1.3 安全存儲

安全簽名用於校驗數據不同,安全存儲是對輸入數據進行加密然後存儲在本地sharepreference中,保護用戶以及客戶端私有數據安全。對於客戶的私有數據,如登錄密碼、用戶名等敏感信息,以及客戶端訪問網絡端獲取的敏感信息如果直接明文存儲在sharepreference中,極容易被攻擊者利用。使用安全存儲,會在寫入sharepreference前進行加密,提升數據的安全性,避免被攻擊者利用。以下圖為例,直接存儲明文密碼易被竊取。

明文存儲的密碼易被竊取

(圖5 明文存儲的密碼易被竊取)

如圖6,使用安全存儲後,數據在存儲前會進行加密,增強數據安全。

安全存儲進行加密存儲

(圖6 安全存儲進行加密存儲)

2 初始化(SecurityInit類)

2.1 初始化說明

初始化負責完成整個聚安全安全組件的全局初始化。初始化是線程安全的,初始化調用隻需要進行一次,無需重複調用。

在使用安全接口時,如檢測到聚安全安全組件未初始化,初始化會被默認執行。但是建議在使用安全接口時首先進行初始化,並判斷初始化是否成功,方便查找原因。

2.2 初始化接口

public static int Initialize(Context context) throws JAQException

功能:

聚安全安全組件初始化

參數:

context:任意 Activity、 Service 等 Coxtext 類非空實例。

返回值:

初始化成功,返回0。

初始化失敗,返回1。

異常:

初始化過程中出現異常時,會拋出JAQException異常。可以根據JAQException實例的getErrorCode()方法獲取錯誤碼。

2.3 錯誤碼

錯誤碼 含義
SEC_ERROR_INIT_CONTEXT_ISNULL 101 參數不正確,請檢查輸入的參數.
SEC_ERROR_INIT_SO_CHECK_ERROR 102 5.x版本之前:libsecurityguard***.so文件和無線保鏢的jar包不匹配。請檢驗是否存在libsecurityguard***.so文件被破壞或修改的情況。
SEC_ERROR_INIT_LOADSO_FAIL 103 5.x版本之前:libsecurityguard*.so文件裝載問題,通常不會發生。如果發生此問題,可以卸載APK,再重新安裝來嚐試。5.x版本及之後:插件對應的內部so加載失敗,請解壓對應插件檢查內部的so版本是否匹配。
SEC_ERROR_INIT_NO_RSA_FILE_ERROR 104 5.x版本之前:APK中沒有正常的RSA簽名文件。請檢驗簽名過程。
SEC_ERROR_INIT_PUBLICKKEY_FIND_ERROR 105 5.x版本之前:RSA文件不正常,無法正常解析出公鑰。
SEC_ERROR_INIT_SO_NOT_EXIST 106 5.x版本之前:在APK中找不到對應aebi的libsecurityguard*.so文件,請檢查是否正常打包了無線保鏢SDK提供的so文件。(不同版本的不通用,請不要拿其他版本的替換)
SEC_ERROR_INIT_DECODESO_FAIL 107 5.x版本之前:libsecurityguard*.so解碼失敗,請卸載後全新安裝或檢查磁盤空間。
SEC_ERROR_INIT_LOADSOINNER_FAILED 108 5.x版本之前:加載內部so失敗。
SEC_ERROR_INIT_FDSOFUN_FAILED 109 5.x版本之前:內部so運行失敗。
SEC_ERROR_INIT_PLUGIN_NOT_EXISTED 110 插件不存在,請檢查打包配置中,so是否正確打入APK中。
SEC_ERROR_INIT_PLUGIN_LOAD_FAILED 111 加載插件失敗,一般不會發生。請檢查是否存在IO異常或內存分配不足。
SEC_ERROR_INIT_LOAD_INTERFACE_NOT_EXISTED 112 獲取接口失敗,請檢查傳入的接口名稱是否正確。
SEC_ERROR_INIT_PLUGIN_REQUIREMENT_NOT_MEET 113 插件依賴不匹配,請檢查插件版本,查看依賴關係是否兼容。
SEC_ERROR_INIT_EXTRACT_DIR_NOT_EXISTED 114 係統IO異常,插件加載目錄打開失敗。
SEC_ERROR_INIT_UNKNOWN_ERROR 199 未知錯誤,請重試。

2.4示例程序

  1. import com.alibaba.wireless.security.jaq.JAQException;
  2. import com.alibaba.wireless.security.jaq.SecurityInit;
  3. //初始化
  4. try {
  5. SecurityInit.Initialize(getApplicationContext());
  6. } catch (JAQException e) {
  7. Log.e(TAG, "errorCode =" + e.getErrorCode());
  8. }

3 異常

3.1 異常說明

當初始化或安全接口調用內部出現異常時,會以JAQException的形式拋出異常。

JAQException類提供了getErrorCode()方法獲取錯誤碼。

3.2 異常接口

public int getErrorCode()

功能:

獲取錯誤碼。

參數:

無。

返回值:

當前調用的錯誤碼。

異常:

初始化過程中出現異常時,會拋出JAQException異常。可以根據JAQException實例的getErrorCode()方法獲取錯誤碼。

4 安全簽名(SecuritySignature類)

4.1 安全簽名說明

安全簽名用於對輸入數據進行加簽,進而在方便在server端進行數據校驗。

4.2 安全簽名接口

public SecuritySignature(Context context)

功能:

初始化SecuritySignature類實例。

參數:

context:任意 Activity 、Service 等 Coxtext 類非空實例。

返回值:

無。

異常:

無。

public String sign(String input, String key) throws JAQException

功能:

使用密鑰key對輸入數據進行簽名。

參數:

input:待加簽數據。

key:存儲於yw_1222_0335.jpg文件中的指定密鑰key。

返回值:

加簽結果。

異常:

出現異常時,會拋出JAQException異常。可以根據JAQException實例的getErrorCode()方法獲取錯誤碼。

4.3 錯誤碼

錯誤碼 含義
SEC_ERROR_SIGNATRUE_INVALID_INPUT 601 參數不正確,請檢查輸入的參數
SEC_ERROR_SIGNATURE_NO_MEM 602 內存分配失敗,請重試
SEC_ERROR_SIGNATURE_NO_SEEDSECRET 606 使用帶seedkey的top簽名時,沒有找到seedkey對應的seedsecret
SEC_ERROR_SIGNATURE_DATA_FILE_MISMATCH 607 圖片文件存在問題。一般是獲取圖片文件時的apk簽名和當前程序的apk簽名不一致。請使用當前程序的apk重新生成圖片
SEC_ERROR_SIGNATURE_NO_DATA_FILE 608 沒有找到圖片文件,請確保圖片文件在resdrawable目錄下
SEC_ERROR_SIGNATURE_INCORRECT_DATA_FILE 609 圖片文件格式有問題,請重新生成圖片文件
SEC_ERROR_SIGNATURE_INCORRECT_DATA_FILE_DATA 610 SEC_ERROR_SIGNATURE_INCORRECT_DATA_FILE_DATA
SEC_ERROR_SIGNATURE_KEY_NOT_EXSITED 611 參數中的key在圖片文件中找不到,請確認圖片文件中有這個key
SEC_ERROR_SIGNATURE_ILLEGEL_KEY 612 輸入的key非法,key不能為:’:’,’|’,’/‘,’.’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’
SEC_ERROR_SIGNATURE_ATLAS_KEY_NOT_EXSITED 613 atlas密鑰不存在
SEC_ERROR_SIGNATURE_LOW_VERSION_DATA_FILE 615 請升級新版本的圖片,當前圖片的版本太低
SEC_ERROR_SIGNATRUE_UNKNOWN 699 未知錯誤,請重試

4.4 示例程序

  1. import com.alibaba.wireless.security.jaq.JAQException;
  2. import com.alibaba.wireless.security.jaq.SecuritySignature;
  3. //安全簽名
  4. SecuritySignature securitySignature = new SecuritySignature(getApplicationContext());
  5. try {
  6. //"helloword":待簽名字串
  7. //"ka1":簽名用的密鑰key
  8. String signStr = securitySignature.sign("helloword", "ka1");
  9. //將簽名結果和原始數據一起發送到服務端,服務端根據原始數據重新計算簽名,並與發送的簽名進行比對,進而完成數據校驗。
  10. sendtoServer("helloword", signStr);
  11. }
  12. catch (JAQException e) {
  13. Log.e(TAG, "errorCode =" + e.getErrorCode());
  14. }

5 安全加密(SecurityCipher類)

5.1 安全加密說明

安全加密用於對輸入數據進行加密。

5.2 安全加密接口

public SecurityCipher(Context context)

功能:

初始化SecurityCipher類實例。

參數:

context:任意 Activity、Service 等 Coxtext 類非空實例。

返回值:

無。

異常:

無。

public String encryptString(String input, String key) throws JAQException

功能:

使用指定密鑰key對輸入數據進行加密。

參數:

input:待加密數據。

key:存儲於yw_1222_0335.jpg文件中的指定密鑰key。

返回值:

加密結果。

異常:

出現異常時,會拋出JAQException異常。可以根據JAQException實例的getErrorCode()方法獲取錯誤碼。

public byte[] encryptBinary(byte[] input, String key) throws JAQException

功能:

使用指定密鑰key對輸入數據進行加密。

參數:

input:待加密數據。

key:存儲於yw_1222_0335.jpg文件中的指定密鑰key。

返回值:

加密結果。

異常:

出現異常時,會拋出JAQException異常。可以根據JAQException實例的getErrorCode()方法獲取錯誤碼。

public String decryptString(String input, String key) throws JAQException

功能:

使用指定密鑰key對輸入數據進行解密。

參數:

input:待解密數據。

key:存儲於yw_1222_0335.jpg文件中的密鑰key。

返回值:

解密結果。

異常:

出現異常時,會拋出JAQException異常。可以根據JAQException實例的getErrorCode()方法獲取錯誤碼。

public byte[] decryptBinary(byte[] input, String key) throws JAQException

功能:

使用指定密鑰key對輸入數據進行解密。

參數:

input:待解密數據。

key:存儲於yw_1222_0335.jpg文件中的指定密鑰key。

返回值:

解密結果。

異常:

出現異常時,會拋出JAQException異常。可以根據JAQException實例的getErrorCode()方法獲取錯誤碼。

5.3 錯誤碼

錯誤碼 含義
SEC_ERROR_STA_INVALID_PARAM 301 參數不正確,請檢查輸入的參數
SEC_ERROR_STA_DATA_FILE_MISMATCH 302 圖片文件有問題。一般是獲取圖片文件時的apk簽名和當前程序的apk簽名不一致。請使用當前程序的apk重新生成圖片
SEC_ERROR_STA_NO_DATA_FILE 303 沒有找到圖片文件,請確保圖片文件在resdrawable目錄下
SEC_ERROR_STA_INCORRECT_DATA_FILE 304 圖片文件格式由問題,請重新生成圖片文件
SEC_ERROR_STA_INCORRECT_DATA_FILE_DATA 305 圖片文件內的內容不正確,請重新生成圖片文件
SEC_ERROR_STA_KEY_NOT_EXISTED 306 參數中的key在圖片文件中找不到,請確認圖片文件中有這個key
SEC_ERROR_STA_ILLEGEL_KEY 307 輸入的key非法,key不能為:’:’,’|’,’/‘,’.’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’
SEC_ERROR_STA_NO_MEMORY 308 內存不足,請重試
SEC_ERROR_STA_NO_SUCH_INDEX 309 在圖片文件中沒有找到這個index
SEC_ERROR_STA_INVALID_ENCRYPTED_DATA 310 非法的加密數據
SEC_ERROR_STA_DECRYPT_MISMATCH_KEY_DATA 311 待解密數據與密鑰不匹配
SEC_ERROR_STA_LOW_VERSION_DATA_FILE 312 請升級新版本的圖片,當前圖片的版本太低
SEC_ERROR_STA_STORE_UNKNOWN_ERROR 399 未知錯誤,請重試

5.4 示例程序

  1. import com.alibaba.wireless.security.jaq.JAQException;
  2. import com.alibaba.wireless.security.jaq.SecurityCipher;
  3. //安全加解密
  4. SecurityCipher securityCipher = new SecurityCipher(getApplicationContext());
  5. try {
  6. //加密字串
  7. //"helloword":待加密字串
  8. //"ka1":加密用的密鑰key
  9. String encryptString = securityCipher.encryptString("helloword", "ka1");
  10. //解密字串
  11. //encryptString:待解密字串
  12. //"ka1":解密用的密鑰key
  13. String decryptString = securityCipher.decryptString(encryptString, "ka1");
  14. byte[] dataBytes = {1,2,3,4,5,6,7,8,9,0};
  15. //加密數組
  16. //dataBytes :待加密數組
  17. //"ka1":加密用的密鑰key
  18. byte[] encryptBytes = securityCipher.encryptBinary(dataBytes, "ka1");
  19. //解密數組
  20. //encryptBytes:待解密數組
  21. //"ka1":解密用的密鑰key
  22. byte[] decryptBytes = securityCipher.decryptBinary(encryptBytes, "ka1");
  23. }
  24. catch (JAQException e) {
  25. Log.e(TAG, "errorCode =" + e.getErrorCode());
  26. }

6 安全存儲(SecurityStorage類)

6.1 安全存儲說明

安全存儲對應用數據進行加密存儲。

6.2 安全存儲接口

public SecurityStorage (Context context)

功能:

初始化SecurityStorage類實例。

參數:

context:任意 Activity、Service 等 Coxtext 類非空實例。

返回值:

無。

異常:

無。

public int putString(String key, String value) throws JAQException

功能:

保存數據。

參數:

key:索引value的key。

key:value待存儲的數據。

返回值:

存儲成功返回1,否則返回0.

異常:

出現異常時,會拋出JAQException異常。可以根據JAQException實例的getErrorCode()方法獲取錯誤碼。

public void removeString(String key) throws JAQException

功能:

刪除數據。

參數:

key:索引value的key。

返回值:

刪除成功返回1,否則返回0.

異常:

出現異常時,會拋出JAQException異常。可以根據JAQException實例的getErrorCode()方法獲取錯誤碼。

public String getString(String key) throws JAQException

功能:

獲取數據。

參數:

key:索引value的key。

返回值:

獲取成功返回1,否則返回0.

異常:

出現異常時,會拋出JAQException異常。可以根據JAQException實例的getErrorCode()方法獲取錯誤碼。

6.3 錯誤碼

錯誤碼 含義
SEC_ERROR_DYN_STORE_INVALID_PARAM 501 參數不正確,請檢查輸入的參數
SEC_ERROR_DYN_STORE_NO_MEMORY 502 內存不足,請重試
SEC_ERROR_DYN_STORE_GET_SYS_PROPERTIES_FAILED 503 獲取係統屬性失敗,請確認是否有軟件攔截,獲取係統參數
SEC_ERROR_DYN_STORE_GET_DATA_FILE_KEY_FAILED 504 獲取圖片文件的秘鑰失敗,請確認圖片文件的格式和內容是否正確
SEC_ERROR_DYN_STORE_GET_ENCRYPT_KEY_FAILED 505 獲取動態加密秘鑰失敗,請重試
SEC_ERROR_DYN_STORE_INVALID_ENCRYPTED_DATA 506 待解密數據不是可解密數據
SEC_ERROR_DYN_STORE_DECRYPT_MISMATCH_KEY_DATA 507 待解密數據與密鑰不匹配,請重試
SEC_ERROR_DYN_STORE_DDPEX_KEY_VALUE_NOT_EXSIT 508 傳入key對應的value不存在
SEC_ERROR_DYN_STORE_UNKNOWN_ERROR 599 未知錯誤,請重試

6.4 示例程序

  1. import com.alibaba.wireless.security.jaq.JAQException;
  2. import com.alibaba.wireless.security.jaq.SecurityStorage;
  3. //安全存儲
  4. SecurityStorage securityStorage = new SecurityStorage(getApplicationContext());
  5. try {
  6. //保存"helloword"
  7. securityStorage.putString("mykey", "helloword");
  8. //獲取"helloword"
  9. securityStorage.getString("mykey");
  10. //刪除"helloword"
  11. securityStorage.removeString("mykey");
  12. }
  13. catch (JAQException e) {
  14. Log.e(TAG, "errorCode =" + e.getErrorCode());
  15. }

7 模擬器檢測

7.1 組件介紹

接入用戶通過聚安全風控接口,對用戶、軟件環境、硬件環境進行安全驗證,從而在注冊、登錄等場景進行風險的防控。

public SecurityVerification (Context context)

功能:

初始化SecurityVerification類實例。

參數:

context:任意Activity、Service等Coxtext類非空實例。

返回值:

無。

異常:

無。

public String doJAQVerfificationSync (HashMap<String, String> info, int timeout) throw JAQException

功能:

安全防控接口。調用此接口後,會得到一個token。將此token作為憑證,可以到聚安全服務端進行防控結果的獲取。(此接口有耗時操作,不能在UI線程內調用)

參數:

info:擴展碼數,其他需要的信息,以key-v形式存在於info中,可選。

timeout:接口超時時間,單位秒。隻能傳入1 <= timeout <= 22的整型,傳入其他值,將使用默認超時時間(22秒)。

返回值:

安全Token。失敗時返回null。調用方得到此token後,需要將此token傳遞到自己的server端,再由自己的server端將此token透傳到聚安全server端,獲得最後的風控校驗結果。

異常:

出現異常時,會拋出JAQException異常。可以根據JAQException實例的getErrorCode()方法獲取錯誤碼。

7.2 錯誤碼

錯誤碼 含義
SEC_ERROR_SECURITYBODY_INVALID_PARAM 1401 參數不正確,請檢查輸入的參數。
SEC_ERROR_SECURITYBODY_INVALID_THREAD 1402 接口調用線程錯誤。請在非UI線程內調用此接口(因為本接口有耗時操作)。
SEC_ERROR_SECURITYBODY_NET_ERROR 1403 網絡超時或網絡斷開。
SEC_ERROR_SECURITYBODY_SERVER_ERROR 1404 聚安全服務端器錯誤,請確認應用是否有權限訪問此接口。
SEC_ERROR_SECURITYBODY_APPKEY_ERROR 1405 加密文件yw_1222_0335.jpg格式或其內數據有問題。常見原因為用錯圖片(iOS與Android圖片不通用)或者圖片內沒有存放對應的Top Appkey。
SEC_ERROR_SECURITYBODY_SIGNATURE_ERROR 1406 加密文件yw_1222_0335.jpg格式或其內數據有問題。常見原因為用錯圖片(iOS與Android圖片不通用)或者圖片內沒有存放對應的Top Appkey。
SEC_ERROR_SECURITYBODY_ENCRYPTION_ERROR 1407 數據加密錯誤。
SEC_ERROR_SECURITYBODY_TOP_ERROR 1408 TOP協議錯誤,請檢查手機時間設置是否正常,加密圖片yw_1222_0335.jpg使用是否正確。
SEC_ERROR_SECURITYBODY_CONCURRENT 1409 接口被並發調用錯誤;本接口不支持多線程同時調用。
SEC_ERROR_SECURITYBODY_UNSUPPORTED 1498 接口在這個版本的SDK中不支持。
SEC_ERROR_SECURITYBODY_UNKNOWN_ERR 1499 未知錯誤,請重試。

7.3 示例程序

  1. import com.alibaba.wireless.security.jaq.JAQException;
  2. import com.alibaba.wireless.security.jaq.SecurityVerification;
  3. new Thread(new Runnable() {
  4. @Override
  5. public void run() {
  6. try {
  7. SecurityVerification sv = new SecurityVerification (getContext().getApplicationContext());
  8. String token = sv.doJAQVerfificationSync(null, 20);
  9. //使用此token進行後續的安全驗證
  10. } catch (JAQException e) {
  11. Log.e(TAG, "errorCode =" + e.getErrorCode());
  12. }
  13. }
  14. }).start();

8 模擬器檢測

8.1 組件介紹

檢測程序當前是運行在真實手機中還是模擬器中,運行在模擬器中意味著別人可以更容易的調試和控製我們的程序。直接調用接口就可以得到模擬器檢測的結果。

原型如下:

  1. packagecom.alibaba.wireless.security.open.simulatordetect;
  2. publicinterfaceISimulatorDetectComponent{
  3. publicbooleanisSimulator();
  4. }

8.2 isSimulator

API描述檢測程序當前是運行在真實手機中還是模擬器中,運行在模擬器中意味著別人可以更容易的調試和控製我們的程序。直接調用接口就可以得到模擬器檢測的結果。

  • API原型

publicbooleanisSimulator();

  • 參數說明

無參數

  • 返回值

返回true表明當前手機是模擬器,返回false表明手機是真機。

  • 應用舉例
  1. import com.alibaba.wireless.security.open.simulatordetect.ISimulatorDetectComponent;
  2. import com.alibaba.wireless.security.open.SecurityGuardManager;
  3. SecurityGuardManager manager =null;
  4. try{
  5. manager = SecurityGuardManager.getInstance(getApplicationContext());
  6. ISimulatorDetectComponent simulatorDetectComp = manager.getSimulatorDetectComp();
  7. boolean result = simulatorDetectComp.isSimulator();
  8. }
  9. catch(SecException e) {
  10. e.printStackTrace();
  11. }
  • 錯誤碼解釋

無錯誤碼

最後更新:2016-11-23 16:04:13

  上一篇:go 接入前準備__Android_安全組件教程_移動安全-阿裏雲
  下一篇:go 服務端驗簽及加解密__安全組件教程_移動安全-阿裏雲