基于键盘输入数据的各类信息窃取攻击非常普遍。包括移动金融、电子商务、第三方支付、网络游戏、社交软件等App都存在各类用户信息泄露的环节。大量诸如账号、密码、手机号码、信用卡号、银行卡号、身份证件号码、家庭住址信息、公司地址信息、家庭成员信息、个人私密信息、商业信息等敏感数据被通过App键盘录入移动互联网中。黑客们通过反编译这些流行应用,将键盘钩子(监控程序)捆绑嵌入其中,以监控、窃取用户通过键盘输入的各项数据。
一些流行的键盘输入攻击包括:
针对一些涉及到交易的App,通过对键盘的攻击,可以获得用户账户、证件、密码、银行卡信息、转账信息以及有效联系方式等个人重要信息。 以移动金融、手机网游、社交、移动购物为例,App键盘攻击将会带来以下风险:

| 条目 | 说明 |
|---|---|
| 开发目标 | Android 4.0+ |
| 开发环境 | Android Studio 3.0.1 或者 Eclipse + ADT |
| CPU架构 | ARM 或者 x86 |
| SDK三方依赖 | 无 |
dx-keyboard-x.x.x.aar 包括java代码,资源等libs下的aar和so导入到项目对应的libs目录下
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')
}
打开顶象安全键盘有以下三种方式:
Activity的onCreate下调用DXKeyboardManager.getInstance().init(context);
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) {
}
});
DXKeyboardManager.getInstance().setAdjustDialogView(dialog);
/**
* 显示键盘选项
*/
DXKeyboardOption option = new DXKeyboardOption();
// 自定义“完成”按钮(只对数字键盘生效)。通过 onClickFinish 回调自行处理
option.setFinishBtn(true, "登录");
// 指定纯数字键盘
option.setKbType(DXKeyboardType.NUMBER);
// 开启随机键
option.setRandomKey(true);
/**
* 显示键盘
* activity 上下文
* option 显示选项
*/
DXKeyboardManager.getInstance().show(MainActivity.this, option);
DXKeyboardManager.getInstance().hide();
Activity的onDestroy下调用DXKeyboardManager.getInstance().destroy();
DXSafeEditView 为继承系统 EditText 的文本输入控件inputType的值为number或phone时,默认弹出数字键盘<com.dingxiang.mobile.keyboard.api.view.DXSafeEditView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusableInTouchMode="false"
android:inputType="textPassword" />
DXSafeEditView.getEditString();
支持H5的输入控件唤起顶象安全键盘
Java代码段调用
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
//顶象Javascript 对象初始化
DXJavascriptBridge jsInterface = new DXJavascriptBridge(mContext, mWebView);
mWebView.addJavascriptInterface(jsInterface, "DXobject");
<input type="text" id="dx_id" name="yourpw" value="" readonly onfocus="requreFocus(this)" onblur="requestBlur(this)"/>
<!—获取固定方法 -->
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{*;}
| 条目 | 说明 |
|---|---|
| 兼容平台 | iOS 9 .0+ |
| 开发环境 | XCode 4.0 + |
| CPU架构 | armv7, arm64, i386, x86_64 |
| SDK依赖 | libz, libresolv, libc++ , SystemConfiguration.framework |
顶象安全键盘 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 授权描述文件将 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 () <DXSafeKeyboardDelegate>
@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<DXSafeKeyboardDelegate> delegate;
//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查看:https://www.dingxiang-inc.com/docs/preview/detail/keyboard-faq