顶象安全键盘介绍一、环境现状说明基于键盘输入数据的各类信息窃取攻击非常普遍。包括移动金融、电子商务、第三方支付、网络游戏、社交软件等App都存在各类用户信息泄露的环节。大量诸如账号、密码、手机号码、信用卡号、银行卡号、身份证件号码、家庭住址信息、公司地址信息、家庭成员信息、个人私密信息、商业信息等敏感数据被通过App键盘录入移动互联网中。黑客们通过反编译这些流行应用,将键盘钩子(监控程序)捆绑嵌入其中,以监控、窃取用户通过键盘输入的各项数据。
常见键盘攻击行为:一些流行的键盘输入攻击包括:
输入数据监听攻击键盘截屏攻击破解加密算法窃取输入数据 其他攻击等等键盘劫持攻击输入数据篡改攻击未加密前篡改来自系统底层的内存dump攻击
针对一些涉及到交易的App,通过对键盘的攻击,可以获得用户账户、证件、密码、银行卡信息、转账信息以及有效联系方式等个人重要信息。 以移动金融、手机网游、社交、移动购物为例,App键盘攻击将会带来以下风险:
银行卡账户密码、交易金额、交易信息、交易凭证等被窃取从而造成财产损失被监听游戏帐号、密码,从而造成虚拟财产损失 被窃取社交应用账号、密码,被利用社交关系网络进行精准诈骗被窃取用户资料或商业机密并被售卖交易金额被篡改二、产品说明安全键盘SDK: 是一款具有防止被恶意输入,数据被恶意篡改,真实数据被监听的安全键盘。安全键盘给予你从底层、启动前、输入时、输入后等多个维度进行输入数据保护。作用领域:金融行业,银行行业等敏感数据输入场景。三、底层技术密码在内存中全程加密存储 采用高强度的组合加密算法和机制,对安全键盘输入的信息在全流程实施加密,不留下风险空当。全程安全检测保护 排除非法环境输入(root,越狱,调试模式等),并提示用户防截屏攻击 对截屏攻击进行防御,不回显输入信息。防止从底层获取密码 通过随机布局键盘,防止被底层分析输入节点进而获取密码。防止底层dump内存读取密码 对于底层的内存dump做了有效防护,防止被dump出内存密码的明文拷贝等风险。(android)防输入日志泄露 对输入输出的日志进行保护,防止输出信息打印出明文密码帐户信息。(android)密码so文件加壳保护 在so文件中保存密钥,并对so文件高强度加壳。(android)四、安全键盘接入支持Android接入,如何获取SDK并接入,请见Android接入章节支持iOS接入,如何获取SDK并接入,请见iOS接入章节4.1 Android接入
一、 环境要求条目说明开发目标Android 4.0+开发环境Android Studio 3.0.1 或者 Eclipse + ADTCPU架构ARM 或者 x86SDK三方依赖无二、 集成SDK2.1 获取SDK访问顶象技术官网,注册账号进入安全键盘SDK后台新增App,填写相关信息下载对应平台SDK2.2 SDK文件结构SDK目录结构aar - dx-keyboard-x.x.x.aar 包括java代码,资源等so - 支持4种abi平台的so,键盘native 核心代码2.3 Android Studio 集成点击下载Demo
2.3.1 Android Studio导入aar, so把 libs下的aar和so导入到项目对应的libs目录下
2.3.2 build.gradle 配置android{
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
repositories{
flatDir{
dirs 'libs'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation (name:'dx-keyboard-x.x.x', ext:'aar')
}
三、API使用打开顶象安全键盘有以下三种方式:
3.1 API方式调用3.1.1 初始化建议在Activity的onCreate下调用DXKeyboardManager.getInstance().init(context);
3.1.2 设置输入监听器DXKeyboardManager.getInstance().setListener(new IDXKeyboardListener() {
@Override
public void onTextChange(CharSequence str) {
}
@Override
public void onShow() {
}
@Override
public void onHide() {
}
@Override
public void onClickFinish() {
}
@Override
public void onKbHeightChange(int height) {
}
});
3.1.3 设置Dialog不被键盘遮盖DXKeyboardManager.getInstance().setAdjustDialogView(dialog);
3.1.4 显示键盘
/**
* 显示键盘选项
*/
DXKeyboardOption option = new DXKeyboardOption();
// 自定义“完成”按钮(只对数字键盘生效)。通过 onClickFinish 回调自行处理
option.setFinishBtn(true, "登录");
// 指定纯数字键盘
option.setKbType(DXKeyboardType.NUMBER);
// 开启随机键
option.setRandomKey(true);
/**
* 显示键盘
* activity 上下文
* option 显示选项
*/
DXKeyboardManager.getInstance().show(MainActivity.this, option);
3.1.5 隐藏键盘DXKeyboardManager.getInstance().hide();
3.1.6 销毁键盘建议在Activity的onDestroy下调用DXKeyboardManager.getInstance().destroy();
3.2 DXSafeEditView方式调用DXSafeEditView 为继承系统 EditText 的文本输入控件支持直接在xml上初始化,其中inputType的值为number或phone时,默认弹出数字键盘 android:layout_width="match_parent" android:layout_height="wrap_content" android:focusableInTouchMode="false" android:inputType="textPassword" /> DXSafeEditView 获取真实数据DXSafeEditView.getEditString(); 3.3 Webview方式调用支持H5的输入控件唤起顶象安全键盘 Java代码段调用 WebSettings settings = mWebView.getSettings(); settings.setJavaScriptEnabled(true); //顶象Javascript 对象初始化 DXJavascriptBridge jsInterface = new DXJavascriptBridge(mContext, mWebView); mWebView.addJavascriptInterface(jsInterface, "DXobject"); Html调用 Js相关交互代码 function requreFocus(e){ e.blur(); window.DXobject.requreFocus(e.name , e.type , e.id); } function requestBlur(e){ window.DXobject.requestBlur(e.name , e.type , e.id); } function setText(name , str){ window.document.getElementsByName(name)[0].value = str; } function getValue() { var e = window.document.getElementById("dx_id"); var _name = e.name; var _type = e.type; var _id = e.id; var value = window.DXobject.getValue(_name , _type , _id); alert(value); } 四、混淆配置-dontwarn com.dingxiang.mobile.** -dontwarn *.com.dingxiang.mobile.** -dontwarn *.com.mobile.strenc.** -keep class com.dingxiang.mobile.keyboard.**{*;} -keep class *.com.dingxiang.mobile.**{*;} -keep class com.security.inner.**{*;} -keep class *.com.mobile.strenc.**{*;} -keep class android.support.v4.content.LocalBroadcastManager{*;} 4.2 iOS接入一、环境需求条目说明兼容平台iOS 9 .0+开发环境XCode 4.0 +CPU架构armv7, arm64, i386, x86_64SDK依赖libz, libresolv, libc++ , SystemConfiguration.framework二、 集成SDK2.1 获取SDK访问顶象技术官网,注册账号登录控制台,访问“全流程端防控->安全键盘SDK”模块新增App,填写相关信息下载对应平台SDK2.2 SDK文件结构顶象安全键盘 iOS SDK ,解压得以下几个文件 DXSafeKeyboard_iOS_xxxxx_debug.zip 安全键盘debug 授权集成库DXSafeKeyboard_iOS_xxxxx_release.zip 安全键盘release 授权集成库例如图: 解压DXSafeKeyboard_iOS_xxxxx_xxx.zip 文件,得到以下文件DXSafeKeyboard 文件夹DXSafeKeyboardFramework.framework 已授权framework静态库DXKeyboard.bundle 资源文件other_file 授权描述文件点击下载Demo 2.3 xcode集成将 DXSafeKeyboard 文件夹拖入工程根目录,勾选 Copy iterms if needed 及 Create groups , 并在 Add to targets 中按需勾选target 在项目中添加Linking配置,选择Target -> Build Settings,在Other Linker Flags里添加-ObjC配置 在Build Phases的Link Binary With Libraries里添加SystemConfiguration.framework和libc++.tbd 三、初始化假设在 ViewController 中添加安全键盘,首先引入头文件 #import "DXSafeKeyboard.h" 然后实现 DXSafeKeyboardDelegate 协议中的 keyboard:buttonClicked: 方法,以接收验证结果回调 @interface ViewController () @end @implementation ViewController - (void)keyboard:(DXSafeKeyboard *)keyboard buttonClicked:(DXKeyboardEvent *)action{ //具体实现壳查看demo } @end 最后安全键盘组件,需要传入 DXSafeKeyboardType,设置 delegate DXSafeKeyboard *letterKeyboard = [[DXSafeKeyboard alloc] initWithType:DXSafeKeyboardTypeLetter]; letterKeyboard.delegate = self; letterTextField.inputView = letterKeyboard; 四、接口说明@interface DXSafeKeyboard : UIView //初始化键盘,三种键盘可选: // 字幕键盘(DXSafeKeyboardTypeLetter) // 带操作键数字键盘(DXSafeKeyboardTypeNumberWithEnter) // 纯数字键盘(DXSafeKeyboardTypeOnlyNumber) - (instancetype)initWithType:(DXSafeKeyboardType)type; //键盘代理,用于接收按钮回调 @property (nonatomic, weak) id //enterButton文字 @property (nonatomic, strong) NSString *enterButtonTitle; //enterButton颜色 @property (nonatomic, strong) UIColor *enterButtonColor; //numberpad按下颜色 @property (nonatomic, strong) UIColor *numberPadHlightColor; // 展示键盘(无输入焦点) -(void) showKeyboard; // 隐藏键盘 -(void) hiddenKeyboard; @end 五、问题错误汇总错误码错误描述-1000 , -1101授权失败,请联系顶象客服人员-1102试用版本已过期,请联系顶象客服人员-1103包名相关不正确,请校对包名信息是否跟生成库提供的包名一致六、FAQ具体FAQ查看:https://www.dingxiang-inc.com/docs/preview/detail/keyboard-faq