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