我妈找我说,可以邮寄杨梅了。我二话不说,直接开始给她我的邮寄地址。快速输入的地址让我想到一个问题,现在的输入法是不是知道的太多了?
我只要打出“浙江省杭州市”,联想出来的就是我所在的市区和街道,下面就是我所在的小区......虽然足够便利,但是如果键盘被黑灰产劫持,那么,也足够危险。
而现在市面上基于键盘输入数据的各类信息窃取攻击非常普遍。包括移动金融、电子商务、第三方支付、网络游戏、社交软件等App都存在各类用户信息泄露的环节。大量诸如账号、密码、手机号码、信用卡号、银行卡号、身份证件号码、家庭住址信息、公司地址信息、家庭成员信息、个人私密信息、商业信息等敏感数据被通过App键盘录入移动互联网中。黑客们通过反编译这些流行应用,将键盘钩子(监控程序)捆绑嵌入其中,以监控、窃取用户通过键盘输入的各项数据。
一些流行的键盘输入攻击包括:
针对一些涉及到交易的App,通过对键盘的攻击,可以获得用户账户、证件、密码、银行卡信息、转账信息以及有效联系方式等个人重要信息。 以移动金融、手机网游、社交、移动购物为例,App键盘攻击将会带来以下风险:
基于上述问题,我们要如何防范?
条目 | 说明 |
---|---|
开发目标 | Android 4.0+ |
开发环境 | Android Studio 3.0.1 或者 Eclipse + ADT |
CPU架构 | ARM 或者 x86 |
SDK三方依赖 | 无 |
SDK目录结构
dx-keyboard-x.x.x.aar
包括java代码,资源等把 libs
下的aar
和so
导入到项目对应的libs
目录下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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
下调用<!---->
1 | DXKeyboardManager.getInstance().init(context); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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) { } }); |
1 | DXKeyboardManager.getInstance().setAdjustDialogView(dialog); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | / * * * 显示键盘选项 * / DXKeyboardOption option = new DXKeyboardOption(); / / 自定义“完成”按钮(只对数字键盘生效)。通过 onClickFinish 回调自行处理 option.setFinishBtn(true, "登录" ); / / 指定纯数字键盘 option.setKbType(DXKeyboardType.NUMBER); / / 开启随机键 option.setRandomKey(true); / * * * 显示键盘 * activity 上下文 * option 显示选项 * / DXKeyboardManager.getInstance().show(MainActivity.this, option); |
1 | DXKeyboardManager.getInstance().hide(); |
Activity
的onDestroy
下调用<!---->
1 | DXKeyboardManager.getInstance().destroy(); |
DXSafeEditView
为继承系统 EditText
的文本输入控件inputType
的值为number
或phone
时,默认弹出数字键盘<!---->
1 2 3 4 5 | <com.dingxiang.mobile.keyboard.api.view.DXSafeEditView android:layout_width = "match_parent" android:layout_height = "wrap_content" android:focusableInTouchMode = "false" android:inputType = "textPassword" / > |
<!---->
1 | DXSafeEditView.getEditString(); |
<!---->
1 2 3 4 5 6 | WebSettings settings = mWebView.getSettings(); settings.setJavaScriptEnabled(true); / / 顶象Javascript 对象初始化 DXJavascriptBridge jsInterface = new DXJavascriptBridge(mContext, mWebView); mWebView.addJavascriptInterface(jsInterface, "DXobject" ); |
<!---->
1 | < input type = "text" id = "dx_id" name = "yourpw" value = " " readonly onfocus=" requreFocus(this) " onblur=" requestBlur(this)" / > |
<!---->
1 2 3 4 5 6 7 8 9 10 | <!—获取固定方法 - - > 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;
}
1 2 3 4 5 6 7 8 9 | <!—获取真正的数值 - - > 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); } |
1 2 3 4 5 6 7 8 | - 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
中按需勾选targetTarget
-> Build Settings
,在Other Linker Flags
里添加-ObjC
配置Build Phases
的Link Binary With Libraries
里添加SystemConfiguration.framework
和libc++.tbd
假设在 ViewController
中添加安全键盘,首先引入头文件
1 | #import "DXSafeKeyboard.h" |
然后实现 DXSafeKeyboardDelegate
协议中的 keyboard:buttonClicked:
方法,以接收验证结果回调
1 2 3 4 5 6 7 8 9 10 | @interface ViewController () <DXSafeKeyboardDelegate> @end @implementation ViewController - (void)keyboard:(DXSafeKeyboard * )keyboard buttonClicked:(DXKeyboardEvent * )action{ / / 具体实现壳查看demo } @end |
最后安全键盘组件,需要传入 DXSafeKeyboardType
,设置 delegate
1 2 3 | DXSafeKeyboard * letterKeyboard = [[DXSafeKeyboard alloc] initWithType:DXSafeKeyboardTypeLetter]; letterKeyboard.delegate = self ; letterTextField.inputView = letterKeyboard; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | @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 |
以上。
目前金融银行等App一般都会使用乱码的键盘去防劫持,但是在技术发展的同时,黑灰产目前已经通过深度学习等方式找到破解方式,所以我们更需要“魔高一尺道高一丈”,去超前与黑灰产对抗。