阅读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 服务端验签及加解密__安全组件教程_移动安全-阿里云