我不会顾忌别人怎么看,或者顾忌到放弃什么东西。我喜欢两句诗“天生我才必有用,千金散尽还复来”。当年离开方正,也是这样仰天大笑出门去……
——周鸿祎
随着移动支付的快速普及,如何保障用户信息安全这个问题变得越来越重要。
本文对市面上的Android安全键盘进行了总结,详细分析了为什么采用安全键盘,怎么样实现安全键盘等问题。以及各个产品线使用的安全键盘有何优劣点。以方便开发者对自我开发安全项目键盘进行总结与学习。
在支付、金融、个人信息敏感的系统中,用户的重要个人信息,如支付密码、身份证号等需要优先考虑进行安全保护。
用户输入信息的安全隐患来自四个方面:
从这我们可以看出手机root之后,确实存在比较大的安全隐患。
针对第一种情形,需要我们平时格外注意陌生链接,不要随便点击陌生人发过来的链接地址。
针对第二个问题,输入时放弃第三方输入法,实现自定义的输入键盘,就可以避开这个问题。
针对第三个问题,该问题比较头疼,因为要解决该问题,需要键盘按键没有按下状态以及输入反馈,但是这样处理会严重的影响用户体验。
针对第四个问题,有人于2011年在乌云网站上反应了手机淘宝客户端的安全漏洞,如下图所示:
从图中可以看出,“黑客”成功的获取了用户输入的信息。另外,当手机连上电脑之后,触摸手机屏幕,通过adb shell命令getevent可以看到用户输入的信息。
从上图我们可以看出,此命令可以记录下来,屏幕中任何一个点的点击、滑动、按下,包括硬键盘。getevent会将这些信息以(x,y)坐标点的形式输出到屏幕中。
即,我们可以根据屏幕的宽、高度,按照比例尺,完全还原出来,用户在手机上的输出操作。
更加具体的如何监控,我之前也写过相关键盘监控方向的文章:
http://blog.csdn.net/yzzst/article/details/45747507
感兴趣的同学可以跳转过去看看。
下面我们就具体说说,如何制作一个安全可靠的输入键盘。
既然,存在上面的4中情况能够记录到我们的键盘信息,那么我们就通过其他方式避免的此安全隐患。
目前自定义安全键盘的做法大概有两种:
由于这种做法是自定义的软键盘,依然会在event1文件中写入触摸信息,因此为了保证输入更加安全,采用随机键盘。随机键盘是指键值是随机分布的,如下图所示:
经过这样处理之后,即使“黑客”获取到触摸信息,但由于键值具有随机分配的特性,提升了输入的安全性。这种做法目前使用最多,可以在许多银行的app中看到。
通过button点击事件,模拟输入。但是这种做法在实现中有一个问题,就是自定义的view,当遮挡住输入框时,处理比较复杂。分析支付宝安全键盘的做法可知,支付宝安全键盘使用的是该做法。但是如果只是自定义了view,没有使得键值随机分布,依然没有消除安全隐患。因为Event1中保存的是触摸屏幕的触摸信息,如果键值没有实现随机分布,依然可以从event1中推断出用户输入信息。
目前凡是设计到了金钱交易的客户端,如微信、支付宝、招商银行app客户端均可以发现采用了安全键盘。如下图所示为微信端的安全键盘:
对于一直提供Android应用安全的安全服务商,梆梆安全来说。它们也提供了一套自己的安全键盘SDK。
最特别的是,它们在提供安全键盘的同时还提供了一个在键盘上预览的输入框(EditText)。如下图所示:
但是,这里梆梆与上面几家不同,它将数字键盘做了一个随机排列。如下:
我们逆向后看到,其的实现方式,就是使用了一个自定义的Dialog来作为键盘的主界面。如下图:
其具有特色的加密EditText View。重写了getString方法。并使用Cypter加密类,在ndk层完成了对输入的敏感数据的加密。如下图:
总结:
从以上可以看出,不论是那种方案,这各大商家企业家都没采用随机键盘(梆梆除外)。应该是考虑到用户操作习惯的问题。采用随机键盘虽然能够保证更加安全,但用户体验不好。
对于getevent与屏幕录像问题,都需要Root权限,影响面没有我们想象中的那么大。所以各大商家都更偏向让自己的产品用户体验变好,没有采用随机键盘。
目前实现安全键盘的方式主要有两种:
通过使用android系统提供的组件keyboardview,自定义按键,实现自定义键盘;
通过完全自定义的view,通过按钮的点击事件模拟键盘的输入。
这两种方案各有弊端。
对于前者,是系统提供的键盘设计接口,我们只需要简单的设计一个键盘的xml文件,给keyboardview设置进去,即可实现一个比较简单的键盘。优点就是,开发起来方便。但是,键盘界面与安全性,完全不可控,我们不做考虑。
通过高强度的组合加密算法和机制,对安全键盘输入的信息在全流程实施加密,不留下风险空挡。
对于输入时的截屏攻击进行防御,不回显输入信息。
通过键盘位置每次随机布局,数字键盘每次输入后变化,防止从底层驱动分析输入点,从而分析并获取密码。
对于底层的内存dump做了有效防护,防止dump出内存密码明文拷贝等风险。
/*
* @author zhoushengtao(周圣韬)
* @since 2015年7月3日 11:04:22
* @weixin stchou_zst
* @blog http://blog.csdn.net/yzzst
* @交流学习QQ群:341989536
* @私人QQ:445914891
/
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/yzzst/article/details/46741681