白盒加密 SDK 的目标是帮忙客户端低成本接入高标准的平安爱护机制,免受歹意平安攻打,从而集中精力建设业务自身。
话不多说,咱们明天来看看 Android 能够如何接入白盒加密 SDK。
环境需要
条目 | 阐明 |
---|---|
兼容平台 | Android 4.0+ |
开发环境 | Android Studio 3.0.1 或者 Eclipse + ADT |
CPU 架构 | ARM 或者 x86 |
SDK 三方依赖 | 无 |
SDK 接入
1.SDK 获取
1)拜访顶象技术官网,注册账号
2)登录, 进入控制台,拜访“全流程端防控 -> 白盒加密 SDK”模块
3)新增 App,填写相干信息
)下载对应平台 SDK
2.SDK 文件构造
- SDK 目录构造
- assets Android 资源文件
- dx-whitebox-${version}.jar Android jar 包
- armeabi, armeabi-v7a, arm64-v8a, x86 4 个 abi 平台的动静库文件
Android Studio 集成
点击下载 Demo
想间接运行 demo 我的项目的话,请跑 gradle 命令 assembleRelease
1.Android Studio 导入 jar, so
- 将 dx-whitebox-x.x.x.jar, so 文件放到相应模块的 libs 目录下
- 将 assets 中资源文件放到相应我的项目 assets 目录下
- 没有 assets 目录的,在 Android Studio 对应 app 目录下新建 Assets Folder
2.build.gradle 配置
android{
sourceSets {
main {jniLibs.srcDirs = ['libs']
}
}
packagingOptions {doNotStrip "**/libDX*.so"}
}
repositories{
flatDir{dirs 'libs'}
}
dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])
}
3. 混同配置
-dontwarn *.com.dingxiang.mobile.**
-dontwarn *.com.mobile.strenc.**
-keep class com.dingxiang.mobile.whitebox.**{*;}
-keep class com.security.inner.**{*;}
-keep class *.com.dingxiang.mobile.**{*;}
-keep class *.com.mobile.strenc.**{*;}
React Native 形式集成
点击下载 Demo
1.React Native 环境配置
具体参考 facebook 官网文档:https://facebook.github.io/react-native/docs/getting-started
2. 集成 SDK
通过官网 react-native init {project_name}命令,可生成 Android Studio 我的项目,其目录在:ReactNative 根目录的 android 目录下
Android Studio 我的项目如何集成 SDK,请参考 前文 Android Studio 集成
3. 引入 React Native 库
build.gradle 下:
dependencies {implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
implementation "com.facebook.react:react-native:+" // From node_modules
}
4. 增加 React Native Android 代码
- 创立 ReactContextBaseJavaModule 实现类
此类是 RN 和 Android 交互的桥接类。如需 JS 调用 Android 办法,必须在办法前增加 ReactMethod 正文,如上面 startDemoTest 办法。
public class DXModule extends ReactContextBaseJavaModule {public DXModule(ReactApplicationContext reactContext) {mContext = reactContext;}
@Override
public String getName() {return "DXModule";}
@ReactMethod
public void startDemoTest(int param1, final Callback callback){// 调用 SDK 的中央,具体例子请查看 Demo}
...
}
- 创立 ReactPackage 实现类
其中 createNativeModules 办法要返回 DXModule 的实例
public class DXPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {List<NativeModule> modules = new ArrayList<>();
modules.add(new DXModule(reactContext));
return modules;
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {return Collections.emptyList();
}
}
- 创立 ReactApplication 实现类
其中 getPackages 办法要返回 DXPackage 的实例
public class MainApplication extends Application implements ReactApplication {private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {return BuildConfig.DEBUG;}
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(new MainReactPackage()
, new DXPackage());
}
@Override
protected String getJSMainModuleName() {return "index";}
};
@Override
public ReactNativeHost getReactNativeHost() {return mReactNativeHost;}
@Override
public void onCreate() {super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
}
}
- 创立 ReactActivity 实现类
其中 DXWhiteboxRNDemo 就是 ReactNative 须要注册的入口
public class MainActivity extends ReactActivity {
/**
* Returns the name of the main component registered from JavaScript.
* This is used to schedule rendering of the component.
*/
@Override
protected String getMainComponentName() {return "DXWhiteboxRNDemo";}
}
5.AndroidManifest 配置
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="false"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
6.React Native 调用 Android 代码
- 注册 Android 模块 批改文件 {RactNative_pro}/app.json:
{
"name": "DXWhiteboxRNDemo",
"displayName": "DXWhiteboxRNDemo"
}
- 批改 JS 主界面 批改文件 {RactNative_pro}/App.js:
import React, {Component} from 'react';
import {Button, DeviceEventEmitter, NativeModules, View} from 'react-native';
export default class NativeInteractionDemo extends Component {
// 注册监听
componentDidMount() {this.subscription = DeviceEventEmitter.addListener('DXEvent', function (msg) {alert(msg)
});
}
componentWillUnmount() {this.subscription.remove();
}
render() {
return <View>
<Button
onPress={() => {this.startDemo();
this.showToast();}
}
title="开始 Demo"
/>
</View>
}
// 调用安卓原生代码并回传数据
startDemo() {NativeModules.DXModule.startDemoTest(1, (status, msg) => {console.log('status:' + status + ' ' + msg);
}
);
}
// 调用原生安卓土司
showToast() {NativeModules.DXModule.showToast("正在执行测试...")
}
}
7. 运行 Android 我的项目
ReactNative 目录下,执行命令react-native run-android
DXWhiteBox 类阐明
在调用性能办法之前必须调用初始化办法
1.SDK 初始化
/**
* @description SDK 全局初始化,个别放在利用启动处调用,如 Application.onCreate 里。* 调用 setup()办法后,会在以后 app 内启用:内存保护、调试器监测、设施 root 监测、* 代码注入监测、代码 hook 监测、Android 模拟器检测、Android app 多开监测等运行时平安检测。*
* @param context Android 上下文
* @return 初始化是否胜利
*/
public static boolean DXWhiteBox.setup(Context context);
2. 数据加密 / 解密
/**
* @description 加密
* @param key 指定加密形式:k0~k9。具体阐明请看“k0~k9 应用阐明”* @param input 待加密数据
* @return 加密后的数据
*/
public static byte[] encrypt(String key, byte[] input);/**
* @description 解密
* @param key 指定解密形式:k0~k9。具体阐明请看“k0~k9 应用阐明”* @param input 待解密数据
* @return 解密后的数据
*/
public static byte[] decrypt(String key, byte[] input);/**
* @description 无 key 加密,外部随机
* @param input 待加密数据
* @return 加密后的数据
*/
public static byte[] encrypt( byte[] input);
/**
* @description 无 key 解密,外部随机
* @param input 待解密数据
* @return 解密后的数据
*/
public static byte[] decrypt( byte[] input);
3. 文件加密 / 解密
/**
* @description 解密形式读取文件
* @param key 指定解密形式:目前容许的 key 为 k0, k4, k5, k6, k9。具体阐明请看“k0~k9 阐明”* @param filePath 文件门路
* @return 文件内容
* @throws IOException
*/
public static byte[] readFile(String key, String filePath) throws IOException
/**
* @description 加密形式写文件
* @param key 指定加密形式:目前容许的 key 为 k0, k4, k5, k6, k9。具体阐明请看“k0~k9 阐明”* @param data 写入数据
* @param filePath 指标文件门路
* @throws IOException
*/
public static void writeFile(String key, byte[] data, String filePath) throws IOException
4. 加签 / 验证
/**
* @description 加签数据
* @param key 加签形式,k0 ~ k9。具体阐明请看“k0~k9 应用阐明”* @param input 加签数据
* @return 加签输入数据
*/
public static String sign(String key, byte[] input);/**
* @description 验签
* @param key 验签形式,k0 ~ k9。具体阐明请看“k0~k9 应用阐明”* @param input 验签数据
* @param sig 加签值
* @return 验签是否胜利
*/
public static boolean verify(String key, byte[] input, String sig);/**
* @description 随机加签,不须要指定加签形式
* @param input 待加签数据
* @return 加签数据
*/
public static String sign(byte[] input);
/**
* @description 随机验签,不须要指定加签形式
* @param input 待验签数据
* @param sig 加签值
* @return 验签是否胜利
*/
public static boolean verify(byte[] input, String sig);
以上就是整个白盒加密 SDK 的流程,如有不足之处,请多指教~