摘 要: 通过对Android短信库的研究,开发了基于Android的私密短信系统,实现了点到点的短信加密通信,重点阐述了系统的主要功能,短信收发流程和实现中的关键问题,本系统通过了真机运行测试。
关键词:Android;私密短信;加密
2007年11月Google公司推出Android[1]智能手机平台,接着推出的面向Android应用开发的SDK[2]为开发者开发Android平台上各种应用提供了方便。随着时间的推移,各种应用层出不穷,目前国内已经出现了很多汇集Android应用的网站,如AppChina应用汇和安智市场等。
Android有活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供者(Content Provider)4大组件[3]。
活动主要用来进行应用界面的开发,一个活动往往占据当前的窗口,对于开发者而言,就需要派生一个Activity的子类。服务有点像后台程序,通常都是后台长时间运行,接受上层调用指令,完成相关功能。广播接收器用来接收一种或若干种意图(Intent)的触发事件,当事件发生时,系统会传递消息给广播接收器,进而由广播接收器进行进一步处理。广播接收器一般用来监听一些事件,如:监听来电、邮件和短信等。内容提供者是Android提供的第三方应用数据的访问方案。每个Content Provider都用一个URI作为独立的标识,如:content://sms/inbox表示短信收件箱。Content Provider在屏蔽了内部数据的存储细节基础上向外提供了统一的接口,这样大大简化了上层应用的访问。
除了4大组件外,Android还提供了意图(Intent)机制,它能在程序运行的过程中连接2个不同的组件。活动、服务和广播接收器都是通过意图机制激活的,意图在组件之间传递数据。
1 Android短信库
1.1 短信息表结构
Android系统中采用的SQLite[4]嵌入式数据库,其短息库为mmssms.db,在adb shell中可以通过sqlite3 mmssms.db连接该数据库。通过.tables命令可以发现mmssms.db共有13个表,其中的sms表是用来存储所有短息数据的,通过.schema sms命令查看表sms的表结构,其表结构如表1所示。
1.2 短信库的访问
系统数据库的访问需要授权,在编写程序时需要在AndroidManifest.xml文件中添加权限使用说明。如:
Android通过内容提供者向应用提供访问底层数据库,应用程序可以通过一个URL访问对应的数据,如:content://sms/inbox表示短信收件箱,而content://sms/outbox表示短信发件箱。
数据表的访问在Android采用游标方式,通过Activity类的manageQuery方法获得一个数据集游标,managedQuery方法的声明为:public final Cursor managedQuery(Uri uri,String[] projection,String selection,String[] selectionArgs, String sortOrder)。
2 系统设计
2.1 系统功能
私密短信系统的功能主要包括:(1)建立短信,加密短信,发送短信;(2)私密短信列表;(3)查收私密短信,解密查看;(4)联系人选择;(5)私密短信会话。
2.2 私密短信收发过程
私密短信系统通过在应用层加密/解密短信数据达到点对点的密码通信。发送短信方通过输入明文短信、加密短信及发送密文短信实现发送短信功能;接收短信方通过查询短信库和解密短信来阅读短信,考虑到短信传输过程中的编码问题,还要进行编码转换工作。具体的收发短信流程如图1所示。
(1)输入明文:输入与发送的短信明文内容。
(2)输入密码:输入加密使用的密码。
(3)加密:根据输入明文和密码进行加密产生密文,通过javax.crypto中Cipher类提供的功能对密文采用用DES[5]加密。
(4)编码转换:加密后的密文以字节码的形式存在,在发送短信前需要进行进一步的编码,将其转换成Base64编码格式以便能够正常发送短信。
(5)发送短信:通过调用Android提供的API来实现发送短信,在系统中SmsManager类提供的sendTextMessage方法可以实现发送短信功能。
(6)接收短信:通过访问系统短信库中的信息查看接收的短信,检索可以查看所有私密短信。
(7)编码逆转换:编码转换的逆过程。
(8)解密:加密逆过程。
2.3 关键问题
(1)菜单的实现
Android系统支持选项菜单、子菜单和快捷菜单3种菜单。系统采用选项菜单,实现选项菜单需要重载Activity的onCreateOptionsMenu(Menu nenu)方法,通过Menu的add方法添加菜单项,对于菜单的响应则是通过重载onOptionsItemSelected(MenuItem item)方法实现。
(2)加密转码
加密采用的是Cipher类实现的,其中的getInstance方法可以获得相应的实例,通过init方法初始化加密模式和密码,通过doFinal方法进行加密并返回加密后的字节数组。
加密后的字节数组并不能直接用于短信内容发送,因此还要进行进一步的转码。系统将加密后的字节数组密文转换成Base64编码组成的字符串后作为短信内容进行传输。
(3)密信标志
加密转码后的短信和普通短信一样借助于移动网络传输,接收方收到的就是一个短信,只不过短信内容是没有意义的密而已。系统为了区分加密短信和未加密的短信,在发送私密短信时在密信内容中加入了供系统识别的密信标志。通过密信标志,接收方可以过滤接收的所有密信。
(4)短信发送
在Android系统中,SmsManager类提供sendTextMessage方法发送短信,具体代码为:smsManager.sendTextMessage(mobile,null,text,null,null)。其中,mobile为目标手机号码,text为发送的短信内容。对于长度较小的短信系统采用直接发送的方式实现,对于长度超过70 B的短信,系统通过分割成多个短信的方式进行发送,以便用户能够接收到完整的短信内容。
3 系统测试
系统测试采用的摩托罗拉XT502机型,图2为系统主界面,默认列出系统收到的所有密信,可以通过相应的菜单执行相应的功能。
发送密信菜单可以打开加密和解密界面,如图3所示。图中显示的是明文为“你好”,密码为“123”的加密和解密界面。
随着3G手机不断普及,用户可以越来越多地定制自己的应用,信息安全传输的重要性更是不可忽视。私密短信系统为用户提供点对点的私密通信,信息在网络的传输过程中采用的密码形式,即使信息被拦击或被通信公司泄露,解密也会大大地提高成本,从而提高用户传输信息的安全性。下一步的研究开发将侧重于私密通话研究,防止电话窃听。
参考文献
[1] http://www.android.com/,2012-03-01.
[2] http://developer.android.com/sdk/index.html,2012-03-01.
[3] 杨丰盛.Android应用开发揭秘[M].北京:机械工业出版社,2010.
[4] http://www.sqlite.org,2012-03-01.
[5] 顾超.动态DES算法.计算机应用与软件[J].2007,7:164-166.