Android安全输入设计与思考

我不会顾忌别人怎么看,或者顾忌到放弃什么东西。我喜欢两句诗“天生我才必有用,千金散尽还复来”。当年离开方正,也是这样仰天大笑出门去……

——周鸿祎



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

本文对市面上的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出内存密码明文拷贝等风险。

/*

* @author zhoushengtao(周圣韬)

* @since 2015年7月3日 11:04:22

* @weixin stchou_zst

* @blog http://blog.csdn.net/yzzst

* @交流学习QQ群:341989536

* @私人QQ:445914891

/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-22 02:23:07

Android安全输入设计与思考的相关文章

Android App的设计架构:MVC,MVP,MVVM与架构经验谈

来源: Android App的设计架构:MVC,MVP,MVVM与架构经验谈 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于App的架构如何设计: 我的App需要应用这些设计架构吗? MVC,MVP等架构讲的是什么?区别是什么? 本文就来带你分析一下这几个架构的特性,优缺点,以及App架构设计中应该注意的问题. 1.架构设计的目的 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员

Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&HTML5架构设计与实战开发

掌握Android从底层开发到框架整合技术到上层App开发及HTML5的全部技术: 一次彻底的Android架构.思想和实战技术的洗礼: 彻底掌握Andorid HAL.Android Runtime.Android Framework.Android Native Service.Android Binder.Android App.Android Testing.HTML5技术的源泉和精髓等核心技术,不仅仅是技术和代码本身,更重要的是背后的设计思想和商业哲学. 一.课程特色 l  贯通And

Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&Browser架构设计与实战开发

在软硬整合领域, Android以其对软件和硬件的高度开放性引领了当今的软硬整合潮流,全世界正在进行一场轰轰烈烈的Android运动,Android以不可思议的速度渗透越来越广的领域,Android智能手机.Android智能电视.Android微波炉.Android平板电脑.Android智能机器人.Android车载系统等越来越多的Android产品涌入人们的工作和生活中,自从Google的[email protected]战略发布以来,更是让世界对Android充满了怦然心动的期待,可以预

Android 系统UI设计规则

1. Android UI技巧 1.1 不该做什么 1.2 该做什么 2. Android UI 设计理念和注意事项 2.1 Android UI设计理念 2.2 优秀UI设计准则 2.3 设计需要考虑 3. Android UI 框架特性/界面布局 4. Android UI 图标设计原则 4.1 图标的尺寸规则和密度 4.2 图标的设计规则 5. Android UI 开发的GUI工具包,图标,字体和工具 5.1 视觉开发工具 5.2 Android 模板.PSD.矢量工具 5.3 Andr

Unity3d Android SDK接入解析(二)Unity3d Android SDK的设计与两种接入方式

一.前言 上篇说清楚了Unity和Android调用的方式,但很多实际接入的部分没有讲的很详细,因为重头在这篇,会详细讲述具体接入Android SDK的方式,和怎么去做一个方便Unity接入的SDK. 传送门: 前篇:Unity3d 与 Android之间的互相调用 http://blog.csdn.net/yang8456211/article/details/51331358 后篇:Unity3d Android SDK接入解析(三)接入Android Library的理解 http://

[转]Android程序框架设计

这篇文章主要内容来自于之前我讲的一个PPT文档,现在将其整理如下.欢迎指正.以下的内容都是来自于我自身的经验,欢迎大家多提自己的建议. 1.一些概念 模式的定义: 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心.通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作. 什么是设计模式? 设计模式是在某种特别的情况下,针对某种问题的某种典型.通用的解决方法. 我们是需要适当了解并学习一些设计模式,在程序开发过程中,总是会涉及到一些框架设计,模块

响应式设计的思考:媒体查询(media query)

Jason Grigsby发表了篇文章,<CSS Media Query for Mobile is Fool’s Gold>对媒体查询(media query)吐槽,大意是在移动设备上使用媒体查询会造成很多资源的浪费——浏览器请求到很多用不到的图片等资源,然后写了一些测试用例测试一些可用方法.然后Tim Kadlec写了篇<Media Query & Asset Downloading Results>,用js自动化的测试了Jason Grigsby的用例. 本文主要整理

【转】Android的材料设计兼容库(Design Support Library)

转自:http://www.jcodecraeer.com/a/anzhuokaifa/developer/2015/0531/2958.html?mType=Group Android的材料设计兼容库(Design Support Library) 泡在网上的日子 发表于 2015-05-31 00:23 第 7641 次阅读 兼容包 1 导读:这个兼容库很容易和之前的 Android Support Library 22.1混淆,都是兼容库,区别是这个库多了个Design. Android

android app 架构设计02

二:在开放的过程中,尽量把工具类,BaseActivity 放在指定的位置, DateFormat Bitmap Notification Shared Preference Environment Device 三: 2.2 Task管理 线程只是一种机制,保证我们要完成的任务不运行在UI线程(也就是说不阻塞UI),完成的任务才是我们关注的核心,因此,我们可以通过设计,把线程封装,让使用者根本感觉不到是线程,他只用关心他要做的事情就行了. 这里,我们可以设计一种"异步链式调用"的框架