随着移动支付的快速普及,如何保障用户信息安全这个问题变得越来越重要。

 本文对市面上的Android安全键盘进行了总结,详细分析了为什么采用安全键盘,怎么样实现安全键盘等问题。以及各个产品线使用的安全键盘有何优劣点。以方便开发者对自我开发安全项目键盘进行总结与学习。


为什么使用安全键盘?

在支付、金融、个人信息敏感的系统中,用户的重要个人信息,如支付密码、×××号等需要优先考虑进行安全保护。

用户输入信息的安全隐患来自四个方面:

  1. 通过盗号***:伪造一个链接,得到用户输入的用户名和密码

  2. 第三方输入法:比如使用xx输入法,则用户的信息完全暴露在第三方面前(ps:乌云网上曾经曝光过sougou输入法漏洞)

  3. 屏幕录像的方法录制屏幕:该方法需要手机具有root权限

  4. 键盘记录器:可以通过读取系统驱动层dev/input/event1中的信息,获取手机触屏的位置坐标等信息,获取这些信息需要权限,现在好多手机已经具有了root权限,因此存在窃取键盘信息的可能性。

从这我们可以看出手机root之后,确实存在比较大的安全隐患。

针对第一种情形,需要我们平时格外注意陌生链接,不要随便点击陌生人发过来的链接地址。

针对第二个问题,输入时放弃第三方输入法,实现自定义的输入键盘,就可以避开这个问题。

针对第三个问题,该问题比较头疼,因为要解决该问题,需要键盘按键没有按下状态以及输入反馈,但是这样处理会严重的影响用户体验。

针对第四个问题,有人于2011年在乌云网站上反应了手机淘宝客户端的安全漏洞,如下图所示:

从图中可以看出,“***”成功的获取了用户输入的信息。另外,当手机连上电脑之后,触摸手机屏幕,通过adb shell命令getevent可以看到用户输入的信息。

从上图我们可以看出,此命令可以记录下来,屏幕中任何一个点的点击、滑动、按下,包括硬键盘。getevent会将这些信息以(x,y)坐标点的形式输出到屏幕中。

即,我们可以根据屏幕的宽、高度,按照比例尺,完全还原出来,用户在手机上的输出操作。

更加具体的如何监控,我之前也写过相关键盘监控方向的文章: 
http://blog.csdn.net/yzzst/article/details/45747507 
感兴趣的同学可以跳转过去看看。

下面我们就具体说说,如何制作一个安全可靠的输入键盘。


安全的输入

既然,存在上面的4中情况能够记录到我们的键盘信息,那么我们就通过其他方式避免的此安全隐患。

目前自定义安全键盘的做法大概有两种:

  1. 一种是自定义软键盘

  2. 另一种是自定义view布局,通过按钮模拟键盘输入。

自定义软键盘

由于这种做法是自定义的软键盘,依然会在event1文件中写入触摸信息,因此为了保证输入更加安全,采用随机键盘。随机键盘是指键值是随机分布的,如下图所示: 

经过这样处理之后,即使“***”获取到触摸信息,但由于键值具有随机分配的特性,提升了输入的安全性。这种做法目前使用最多,可以在许多银行的app中看到。

自定义view

通过button点击事件,模拟输入。但是这种做法在实现中有一个问题,就是自定义的view,当遮挡住输入框时,处理比较复杂。分析支付宝安全键盘的做法可知,支付宝安全键盘使用的是该做法。但是如果只是自定义了view,没有使得键值随机分布,依然没有消除安全隐患。因为Event1中保存的是触摸屏幕的触摸信息,如果键值没有实现随机分布,依然可以从event1中推断出用户输入信息。


各大公司的安全键盘设计

目前凡是设计到了金钱交易的客户端,如微信、支付宝、招商银行app客户端均可以发现采用了安全键盘。如下图所示为微信端的安全键盘:

支付宝


微信


招商银行


梆梆安全键盘

对于一直提供Android应用安全的安全服务商,梆梆安全来说。它们也提供了一套自己的安全键盘SDK。

最特别的是,它们在提供安全键盘的同时还提供了一个在键盘上预览的输入框(EditText)。如下图所示:

这里写图片描述

但是,这里梆梆与上面几家不同,它将数字键盘做了一个随机排列。如下:

这里写图片描述

我们逆向后看到,其的实现方式,就是使用了一个自定义的Dialog来作为键盘的主界面。如下图: 

其具有特色的加密EditText View。重写了getString方法。并使用Cypter加密类,在ndk层完成了对输入的敏感数据的加密。如下图: 


总结:

从以上可以看出,不论是那种方案,这各大商家企业家都没采用随机键盘(梆梆除外)。应该是考虑到用户操作习惯的问题。采用随机键盘虽然能够保证更加安全,但用户体验不好。

对于getevent与屏幕录像问题,都需要Root权限,影响面没有我们想象中的那么大。所以各大商家都更偏向让自己的产品用户体验变好,没有采用随机键盘。


开始自定义安全键盘

目前实现安全键盘的方式主要有两种:

  1. 通过使用android系统提供的组件keyboardview,自定义按键,实现自定义键盘;

  2. 通过完全自定义的view,通过按钮的点击事件模拟键盘的输入。

这两种方案各有弊端。

对于前者,是系统提供的键盘设计接口,我们只需要简单的设计一个键盘的xml文件,给keyboardview设置进去,即可实现一个比较简单的键盘。优点就是,开发起来方便。但是,键盘界面与安全性,完全不可控,我们不做考虑。

安全键盘还需要注意的

密码在内存中全程加密存储

通过高强度的组合加密算法和机制,对安全键盘输入的信息在全流程实施加密,不留下风险空挡。

防截屏***

对于输入时的截屏***进行防御,不回显输入信息。

防止从底层驱动分析输入点获取密码

通过键盘位置每次随机布局,数字键盘每次输入后变化,防止从底层驱动分析输入点,从而分析并获取密码。

防止底层dump***内存读取***

对于底层的内存dump做了有效防护,防止dump出内存密码明文拷贝等风险。

转自:

http://blog.csdn.net/yzzst/article/details/46741681