版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕业设计说明书基于Andriod系统私人数据保护软件控制平台XXX学生姓名:学号:XXXXXXXXXXXX学院:XXXXXXXXX专业:XXXXX指导教师:XXXXX2023年6月基于Andriod系统私人数据保护软件控制平台摘要随着信息时代的到来,人们在享受其带来的极大便利和利益的同时,也面临着信息平安的严峻考验,特别是在三年前的“棱镜门〞事件曝光以来,公众对信息平安的重视提到了前所未有的高度,人们对保护自己私人数据的意愿也十分迫切。另一方面,随着传统互联网的进一步普及和新兴移动互联网的繁荣,人们各类社交账号、银行账号等信息也越来越多。记忆和管理数量庞大的账号密码便成了人们的巨大负担。因此设计和开发一款平安、高效的软件来帮助用户管理各种账户和密码变得十分迫切和必要。本文主要介绍上述软件的设计开发过程和相关的开发知识。本系统是一款专注于私人数据保护的Android应用程序它作为平安类软件,有强大的数据平安保障机制。系统采用了AES加密算法作为程序数据加密算法,AES算法具有更高平安性、效率和灵活性,能够抵御的所有攻击方式。同时系统还具有登陆密码验证、数据加密秘钥验证、用户数据跨设备不可使用、非平安状态销毁数据、程序后台驻留控制等多种措施以保障用户数据平安。本系统在Windows系统环境下,使用SDK4.4、SQLite、Eclipse进行开发而来。系统多维的平安保障机制和简单易用的UI设计可以帮助用户平安、快捷、高效地管理私人账户及密码,让用户用得舒心的同时还能让用户用得放心。关键字:Android,信息平安,数据保护,AESBasedontheandroidmobilephonepersonaldataprotectionsoftwarecontrolplatformAbstractWiththeadventoftheinformationage,peopleareenjoyingthegreatconvenienceandbenefitsbroughtbyinformationresourcesandalsofacingaseveretestofinformationsecurityinthecominginformationage.Especiallytheexposureof"Prism"incidentthreeyearsagoraisingthepublicattentiontoinformationtoanunprecedentedheight.Peoplearebecomingmoreurgenttoprotecttheirprivates.Ontheotherhand,alongwiththefurtherspreadingoftraditionalInternetandprosperityofemergingmobileInternet,people’sallkindsofsocialaccountsandbankaccountsinformationarealsoincreasing.Memoryandmanagementofalargenumberoftheaccountpasswordhavebecomeahugeburdenonthepeople.Therefore,thedesignofasecureandefficientsoftwaretohelpusersmanagevariousaccountsandpasswordshasbecomeaveryurgentdesire.Thispapermainlydescribesthedesignanddevelopmentprocessoftheabovesoftwareandrelateddevelopmentknowledge.ThissystemisanAndroidapplicationwhichfocusontheprotectionofpersonaldata.Asasecuritysoftware,therearemanystrongdatasecuritymechanisms.ThesystemusestheAESencryptionalgorithm,aalgorithmwithhighersecurity,efficiencyandflexibilitywhichcanithstandallknownattacks.Andithasmultiplesecuritymeasurestoprotectuserdata,aloginpasswordauthentication,dataencryptionsecretkeyauthentication,userdatacannotbeusedacrossdevices,anon-securestatedestroydata,programdaemoncontrol,etc.ThesystemdevelopfromSDK4.4,SQLite,EclipseunderWindowsenvironment.MultidimensionalsecuritymechanismandeasyusedUIdesigncanhelpusersmanagingprivateaccountsandpasswordsmoresecure,fastandefficient.Allowinguserstosimultaneouslygettheconvenienceandsafety.Keywords:Android,informationsecurity,dataprotection,AES目录1引言…………………11.1开发背景…………11.2研究内容及意义…………………12系统分析……………12.1研究目标…………12.2需求分析…………22.3性能分析…………23系统开发及相关技术………………23.1Android开发环境介绍……………23.1.1Android是什么……………………23.1.2Android系统架构…………………23.1.3已发布的Android版本…………33.2Android开发平台搭建……………43.2.1准备所需的软件…………………43.2.2开发环境搭建…………………44主要功能模块设计…………………84.1平安策略…………84.2引导………………94.3软件登陆密码设置及修改………104.4数据加密密钥设置及修改………114.5工程信息添加、显示、删除及修改………………134.6用户数据备份及导入……………154.7非平安情况下销毁数据…………164.8数据跨设备不可用………………175数据库设计………………………185.1账号密码表………………………185.2登陆密码表………………………186程序实现……………186.1程序工程目录……………………186.2引导………………206.2.1主程序引导……………………206.2.2首次使用引导…………………216.3密码、秘钥验证…………………226.4程序主界面……………………256.5工程信息添加、显示、删除及修改……………256.6用户数据备份及导入…………286.7登陆密码修改…………………326.8加密秘钥修改…………………336.9程序后台驻留…………………357总结………………36附录……………………34参考文献………………37致谢……………………381引言1.1开发背景随着智能设备的快速普及,特别是智能和平板设备,移动互联时代逐渐呈现在我们的面前。在信息时代,人们在享受信息资源所带来的极大便利的同时,也面临着信息平安的严峻考验。尤其是三年前的“棱镜门〞事件曝光以来,公众对信息平安的重视提到了前所未有的高度,人们对保护自己私人数据的意愿也变得十分迫切。另一方面,伴随着传统互联网的进一步普及和新兴移动互联网的繁荣,人们各类社交账号、银行账号等信息也越来越多。出于信息平安的考虑,管理和保存这些账号和密码又不能简单地记录在纸上,单凭大脑去记忆数量如此庞大的信息更是一件不可能完成的事。在这样的双重时代背景之下,设计开发一款私人数据保护软件就显得十分有必要,为保证用户使用的便捷性我选择以移动端设备作为使用平台。当前主流的移动智能设备平台有Android、IOS以及WindowsPhone,但是考虑到用户群的数量和设备的可获得性,最终的选择了Android平台。1.2研究内容及意义本软件是在Andriod系统上进行的设计和开发,提供如下功能:初次使用引导、软件登陆密码设置、软件登陆密码修改、数据加密密钥设置、数据加密密钥修改、账户密码信息添加、账号信息显示、账号信息修改、用户数据备份、用户数据导入及非平安情况下销毁数据等功能。基于Andriod系统私人数据保护软件控制平台的开发可以帮助用户平安、快捷、高效地管理用户的私人账户和密码。简单易用的UI设计可以节约用户对其的管理本钱。同时多维的平安保障机制保证了用户信息的平安。2系统分析2.1研究目标了解在Android平台上进行应用程序开发的过程;运用Android应用开发技术进行私人数据保护软件控制平台软件的开发。本软件是使用Eclipse作为IDE(IntegratedDevelopmentEnvironment)开发工具,并运用AES(AdvancedEncryptionStandard)标准作为加密算法,为用户数据平安保驾护航。2.2需求分析本软件是一个专注于私人数据保护的应用程序,对用户的私人数据进行管理和保护以降低用户管理私人数据的本钱,因此应用应该简单易用、拥有人性化设计的UI,以及最为核心的平安保障机制。从上面的描述中可以根本了解软件的功能需求:有强大的数据平安保障机制;用户使用引导;数据加密密钥设置及修改;软件登陆密码设置及修改;工程信息添加、显示、删除及修改;用户数据备份及导入;非平安情况下销毁数据;数据跨设备不可用等;后台驻留机制。2.3性能分析数据保障机制平安合理、程序响应迅速、信息处理速度快、UI设计人性化、程序健壮等。3系统开发及相关技术3.1Android系统简介3.1.1Android是什么Android〔安卓〕是美国著名科技公司Google在2007年11月5日公布的基于Linux内核的操作系统,是一个移动设备,智能和平板电脑的操作系统。它是由Google领衔的联盟开发,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。3.1.2Android系统架构为了更好的理解Android系统是如何工作的,我们下面看一下它内部的系统架构。Android大体可分为四层框架,五块区域。[2]Linux内核层Android系统基于Linux2.6的内核,该层为Android设备的硬件提供了最底层的驱动支持,例如电池管理、音频驱动、显示驱动、蓝牙驱动、WiFi驱动等等。系统运行库层Android系统包含了一些C/C++库,这些库提供应Android系统中不同的组件使用。它们通过Android应用程序框架为开发者提供效劳。例如SQLite库提供了数据库的支持,SGL库提供底层的2D图形引擎的支持,OpenGL|ES库对3D绘图提供支持等。应用系统层这一层提供了构建应用程序时可能用到的各种API(ApplicationProgrammingInterface),Android系统自带的许多核心应用就是使用这些API完成的,当然Android程序开发者们也能使用这些API来开发自己的应用程序。应用层全部安装在Android设备上的应用程序都是属于这一层的,比方系统自带的通讯录、浏览器、相机等程序,以及用户自己从各类应用商店下载安装的社交软件、各种游戏软件,甚至是你自己开发的应用程序。图3.1Android系统架构3.1.3Android已发布的版本2023年9月,Google正式发布了Android1.0系统,这是Android系统最早的版本。在这之后的几年间,Google不断的推出新的版本,Android2.1、Android2.2、Android2.3系统的推出使得Android占据了大量的市场份额[3]。在2023年2月,Google发布了Android3.0系统,这是特别为平板电脑设计的Android系统,但是市场反响并不好,是Google发布的众多Android系统中为数不多的失败的版本。之后不久,也就是同年10月,Google又发布了全新的重量级版本Android4.0系统,该版本统一了和平板电脑,不再对其进行细分,即应用能在上使用,也能在平板电脑上使用。2023年10月15日的GoogleI/O大会发布了新一代的Android5.0系统,这个版本的使用新的编译模式——ART模式,替代了老旧卡顿的Dalvik,使得这个版本的Android系统成为了Android史上最为流畅的系统,为用户体验带来了极大提升。2023年5月28日的GoogleI/O大会发布了Android6.0系统,这个版本的系统在电量管理、指纹识别、权限管理、APP关联方面提供了全新的支持。2023年5月19日的GoogleI/O大会发布了Android7.0系统,这也是目前为止最新的Android系统版本。3.2Android开发平台搭建Android应用开发可使用Google推出的开发工具AndroidStudio,也可以使用IDE工具Eclipse进行发开,这里所要使用的就是Eclipse的方式。3.2.1准备所需的软件JDKJDK(JavaDevelopmentKit)是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的Java应用程序。JDK是整个Java开发的核心,它包含了Java的运行环境,Java工具和Java根底的类库[7]。我们知道Android系统是使用Java语言来进行开发的,因此Java程序开发时所必需的JDK在Android开发中同样也必不可少。AndroidSDKAndroidSDK(AndroidSoftwareDevelopmentKit)是Google提供的Android开发工具包,在开发Android程序的时候,我们需要引入该工具包,来使用Android开发相关的API。Eclipse相信所有熟悉Java开发的开发者对这个工具一定都非常熟悉,它是Java开发的利器,是最好用的IDE工具之一。因为这个工具是开源的,所以使得有很多优秀的基于Eclipse制作的IDE工具得以问世。Eclipse支持非常多的插件工具,使得它不仅仅用于Java程序的开发,几乎所有主流的开发语言都能得到良好的支持[8],这其中当然也包括Android开发。ADTADT(AndroidDevelopmentTools)是Google提供的一个Eclipse插件,提供了一个高度集成发、强大的Android开发环境。安装了ADT就可以进行联机调试,并且能够模拟各类事件、分析程序性能等等。3.2.2搭建开发环境Google提供了一种很便捷的方式,在Android官网下载到一个已经绑定好SDK的工具包,开发时所需要用到的AndroidSDK、Eclipse、ADT插件都已经包含在里面了,这样可以省去很多费时的安装操作。图3.2SDK工具包目录其中SDKManager是AndroidSDK的管理器,双击翻开它可以看到所有可下载的AndroidSDK版本。因为Android版本已经很多了,都下载的话会很耗时,同时对硬盘空间的需求也很大。并且我们开发的程序主要面向Android4.0以后的系统,因此这里只勾选API14以上的SDK版本,如图3.3所示。图3.3SDKManager勾选完后点击右下角的Install42packages,会进入到一个确认安装界面,如图3.4所示。图3.4选择SDK进行安装选中右下角的AcceptLicense,然后点击Install,只需要等待下载结束,这一个过程可能会持续很长的时间,请耐心等待。经过漫长的等待之后,SDK终于是下载完成了。下载好的所有内容都放在了sdk目录下,里面还包含开发包、文档、例如、源码和其他一些东西。先看一下eclipse这个目录。进入eclipse目录,因为eclipse是免安装的,因此直接点击eclipse.exe来启动Eclipse程序。这个Eclipse是安装好ADT插件的,因此已经可以直接在这个Eclipse上进行Android程序开发!界面和普通的Eclipse没多大区别,不过安装过ADT插件的Eclipse还是会多出一些东西来,比方在Eclipse的工具栏中会出现AndroidSDKManager和AndroidVirtualDeviceManager的图标。AndroidSDKManager之前已经介绍过了,下面介绍一下AndroidVirtualDeviceManager,这个是用来开启Android模拟器的,在开发的时候如果没有Android的话,就必须使用模拟器了。当然建议调试程序的时候使用来进行,因为Android,模拟器会很卡很慢。点击AndroidVirtualDeviceManager,也就是中间的图标会弹出如图3.5所示的窗口。图3.5AndroidVirtualDeviceManager点击右边的“New...〞按钮可以创立一个新的Android模拟器,如图3.6所示。图3.6添加新的Android模拟器这里我们创立一个Android4.4系统的模拟器,因此模拟器名就叫4.4好了,设备选择5.0英寸屏幕的,目标指定为Android4.4,然后分配一下内存和SD卡的大小,点击OK就可以了。等待创立完成后,选中刚刚创立的模拟器,点击Start按钮,在弹出窗口中点击Launch,就可以启动模拟器了,启动完成之后的界面如图3.7所示。至此,Android开发环境就已经成功搭建完成了。图3.7运行Android模拟器4主要功能模块设计4.1程序平安策略设计作为信息平安类应用,优先考虑数平安问题,解决平安问题再考虑相应的功能实现;应用不平安,其他的功能再强大也没有用。因此必须有强大的平安机制作为保障,首先要做的就是选取一种适宜的加密算法。通过查询相关资料,对各种加密方式加密算法诸如:DES、IDEA、RC2、RC5、AES等进行分析、比照后,最终选择最为适宜的加密算法AES作为本应用的数据平安根底。同时应用设置登陆密码验证、数据加密秘钥设置、用户数据跨设备不可使用、非平安状态销毁数据、程序后台驻留控制等等措施来保障用户数据平安。程序数据平安机制如图4.1所示。图4.1数据平安策略4.2引导在启动程序后,系统将自动检测用户是否第一次使用本软件。在用户首次登陆的时候,引导用户进行秘钥和密码设置,同时给出友好的提示。程序具备方便快捷的操作体验。登陆引导流程如图4.2所示,效果如图4.3所示。图4.2登陆引导流程图4.3首次登陆引导效果4.3软件登陆密码设置及修改考虑到实际使用的需求,软件提供密码设置和修改的功能,登陆密码设置流程如图4.4所示、登陆密码修改流程如图4.5所示、效果如图4.6所示。图4.4登陆密码设置流程图4.5登陆密码修改流程图4.6密码设置及修改4.4数据加密密钥设置及修改软件提供加密秘钥的设置和修改的功能,加密秘钥设置流程如图4.7所示、秘钥修改流程如图4.8所示、效果如图4.9所示。图4.7秘钥设置流程图4.8秘钥修改流程图4.9加密密钥设置及修改4.5工程信息添加、显示、删除及修改添加:软件提工程信息添加功能,将添加的数据使用AES加密处理后存入数据库中,进行数据持久化处理。其中可以添加工程描述、账号、密码、以及备注等信息。图4.10工程信息添加流程图4.11工程信息修改流程图4.12工程信息添加、显示、删除及修改显示:进入软件主界面后,将数据库中存储的数据全部读取出来,并在主界面上以列表的形式进行显示。当点击某一个条目之后,进行更为详细的信息显示,并能对其进行修改和删除操作。删除:在点击某个条目之后,会出现删除账号信息的相关操作。点击删除后,将在数据库中永久的删除该记录。修改:在点击某个条目之后,会出现修改账号信息的相关操作。点击修改后,将在新的界面对该条目的具体信息进行修改,包括账号描述、账号、密码以及备注等信息。4.6用户数据备份及导入考虑到用户可能会有刷机、重置等行为〔此类行为会导致手中数据丧失,当然也包括本平台的用户数据〕,因此为方便用户使用和提升用户体验度,软件将参加数据备份和恢复的功能。备份:将数据库中的数据进行加密处理后写入到ROM中。恢复:考虑到用户数据信息的平安性,在进行恢复时要进行秘钥验证,即备份数据时使用的秘钥。图4.13用户数据导入流程图4.14用户数据备份流程图4.15用户数据备份及导入4.7非平安情况下销毁数据为了用户信息的平安性,防止被暴力破解,在连续5次登陆密码输入错误后,软件将销毁数据库中的和ROM上的所有数据,同时设置软件为不可使用状态。图4.16数据销毁子流程图4.17非平安情况下销毁数据4.8数据跨设备不可用为保障用户数据的平安性,要求软件的数据在不同的上不可通用。我们知道每个都拥有一个唯一的“身份证号码〞——IMIE码,因此在设计秘钥的时候可以把的IMIE码的信息参加到其中,每次需要验证秘钥的时候软件自动从系统中获取IMIE码进行验证。如此一来就能实现软件数据在不同设备间不通用的问题。5数据库设计5.1账号密码表〔t_passwd〕表5.1账号密码表〔t_passwd〕字段类型描述Keyinteger主键、自动增长nametext工程名称accounttext账号pwdtext密码baktext备注5.2登陆密码表〔t_pwd_login)表5.2登陆密码表〔t_pwd_login)字段类型描述pwdtext登陆密码fail_countinteger登陆失败次数6程序实现在这个模块中,本文将按照使用程序时进入程序调用Activity的先后顺序作为主线进行程序具体实现的介绍。在介绍具体的程序实现之前,我们首先了解一下软件开发时工程目录下每个文件夹中资源的作用。6.1工程文件目录在程序开发阶段,首先建立相应的工程SecTool。SecTool工程源代码的结构如图6.1所示。图中包含了众多的文件及文件夹,下面将详细对图中的内容进行介绍。src与Java开发一样,在Android开发中src目录也是放置所有Java代码的地方,展开src目录后,就能看到我们所写的Java源代码了。gen这个目录中的所有内容都是Eclipse自动生成的,其中最重要的是R.java文件。在工程里添加资源后,将会在该文件中生成一个唯一对应的id。图6.1工程文件目录assets这个目录开发一般很少使用,放置一些随程序打包的文件,当程序运行时可以动态读取到这些文件的内容。bin这个目录主要包含一些编译时自动产生的文件。我们程序编译好后,会在这里出现一个APK安装包,这个安装包可以直接拷贝到Android设备中安装运行。libs开发的时候使用到的第三方Jar包都应该拷贝到这个目录下。res这个目录中的内容稍微有点多,Android工程中所有使用的图片、布局、字符串这些资源都应该放置在这个目录下面,之前提及的R.java中的内容就是根据这个目录下的文件自动生成的。工程中的图片放在drawable目录下,这里如果需要对不同分辨率的设置使用不同的图片的话,将相应的图片放置在对应的文件夹下就行了;布局文件放置在layout目录中;同时所有的字符串需要放置在values目录中。AndroidManifest.xml此文件是整个Android工程的配置文件,Android中所使用到的四大组件都必须在这个文件中进行注册。并且权限也需要在此文件中声明。perties这个文件中的内容极为简单,通过一行代码指定了编译程序时所使用的SDK版本。6.2引导6.2.1主程序引导当用户点击启动软件后,系统将会判断用户是否首次使用本软件。如果是那么启动首次登陆引导活动GUIDACTIVITY,否那么启动密码、秘钥验证MAINACTIVITY。为判断用户是否第一次使用本系统,这里设计了一个isFirstEnter()方法,此方法将会读取程序是否存在缓存数据,如果存在那么表示软件不是首次使用,返回false;如果不在缓存数据那么,说明软件是首次使用,返回true。privatebooleanisFirstEnter(Contextcontext,StringclassName){if(context==null||className==null||"".equalsIgnoreCAES(className)) returnfalse;SharedPreferencesshare=context.getSharedPreferences(SHAREDPREFERENCES_NAME,Context.MODE_PRIVATE);StringmResultStr=share.getString(KEY_GUIDE_ACTIVITY,"");if(mResultStr.equalsIgnoreCAES("false"))returnfalse;elsereturntrue;}软件启采用了多线程机制,当判断出用户是否第一次使用本系统之后,将会根据相应的值进行跳转,如果是首次使用〔值为1001〕,那么启动秘钥和登陆密码设置界面的Activity。如果不是第一次使用〔值为1000〕,那么将启动密码、秘钥验证Activity,代码实现如下:publicHandlermHandler=newHandler(){publicvoidhandleMessage(Messagemsg){switch(msg.what){cAESSWITCH_MAINACTIVITY:IntentmIntent=newIntent();mIntent.setClass(Guide.this,CheckPWDActivity.class);Guide.this.startActivity(mIntent);Guide.this.finish();break;cAESSWITCH_GUIDACTIVITY:mIntent=newIntent();mIntent.setClass(Guide.this,GuideActivity.class);Guide.this.startActivity(mIntent);Guide.this.finish();break;}super.handleMessage(msg);}}6.2.2首次使用引导首次使用引导功能包含了两个Activity,一个用于设置秘钥(GuideActivity),另一个用于设置密码(SetPwdActivity)。在本程序中使用的加密算法为AES,这此算法中要求加密数据的秘钥为32位。在前面已经说到,为保证软件数据在不同的设备上不能通用,需要将设备的IMIE码参加秘钥。因为IMIE码由15位字母或数字组成,所以用户输入的秘钥最大位数为17位。由于不能确定用户输入的秘钥长度,所以可能在秘钥后面进行“补位〞操作,才能得到最终秘钥。由此可以设计秘钥组成公式如下:密钥=用户输入+IMEI+补位。在GuideActivity中,将会引导用户进行秘钥设置。同时会对用户输入的秘钥用户输入局部进行合法性进行检查,要求用户输入须大于或等于8字符、小于或等于16字符,并且只能包含数字和字母。完成秘钥设置之后将会启动SetPwdActivity来引导用户进行密码设置,这里设计了setWorkKey()方法。publicvoidsetWorkKey(Viewview){ EditTextedit=(EditText)findViewById(R.id.guide_edtext); StringinputData=edit.getText().toString(); if(inputData==null||inputData.trim().equals("")){ OutputInfo.outMessage(edit,GuideActivity.this,"密钥数据不可为空"); return; } byte[]input_byte=inputData.getBytes(); if(input_byte.length>16){ OutputInfo.outMessage(edit,GuideActivity.this,"输入数据超长"); return; } booleancheck=DataUtil.isLetterOrDigit(inputData); if(!check){ OutputInfo.outMessage(edit,GuideActivity.this,"数据内容不符合要求,请输入字母或数字"); return; } IntentsetpasswdActivityIntent=newIntent(); BundlemyBundelForName=newBundle(); myBundelForName.putString("work_key",inputData); setpasswdActivityIntent.putExtras(myBundelForName); setpasswdActivityIntent.setClass(GuideActivity.this,SetPasswd.class); startActivity(setpasswdActivityIntent); GuideActivity.this.finish();}}在密码设置阶段,同样要求密码必须大于或等于8字符,除了包含数字和字母的同时,还能包含以下特殊字符:~、!、@、#、$、%、\、^、&、*、(、)、_、+、-、=、|、}、{、[、]、"、'、:、;、?、>、<、,、.、/。在设置完的秘钥和登陆密码将使用AES加密算法,并以最终生成的秘钥进行加密后保存到数据库中。6.3CheckPWDActivity如果用户不是第一次使用软件将会进入到密码、秘钥验证页面,即进入CheckPWDActivity。在此Activity中,会将用户输入的秘钥、密码进行解析后与数据库中的数据进行核对,如果核对通过那么进入软件主页面MainActivity,如果未通过将弹出对话框想用户提示当前还能输入多少次密码。当输入密码次数超过上限之后,系统的另一个平安机制将会销毁用户的所有数据,以保护用户数据信息平安。这里设计了方法pressEnterbutton()来进行输入密码、秘钥的合法性检查,然后验证密码、秘钥是否正确。CheckFailTimes()方法用于统计输入密码连续错误次数。destroyData()方法那么是用于非平安情况下销毁数据。1)pressEnterbutton()方法具体实现:publicvoidpressEnterbutton(Viewview){ EditTextedit=(EditText)findViewById(R.id.workkey); Stringwork_key=edit.getText().toString(); if(work_key==null||work_key.trim().equals("")){ OutputInfo.outMessage(edit,CheckPWDActivity.this, "秘钥不可为空值"); return; } if(work_key.getBytes().length>16){ OutputInfo.outMessage(edit,CheckPWDActivity.this,"输入数据超长"); return; } booleancheck=DataUtil.isLetterOrDigit(work_key); if(!check){ OutputInfo.outMessage(edit,CheckPWDActivity.this, "数据内容不符合要求,请输入字母或数字"); return; } EditTextedit_passwd=(EditText)findViewById(R.id.passwd); Stringpasswd=edit_passwd.getText().toString(); if(passwd==null||passwd.trim().equals("")){ OutputInfo.outMessage(edit,CheckPWDActivity.this, "密码不可为空值"); return; } booleancheck_pwd=DataUtil.passwdfilter(passwd); if(!check_pwd){ OutputInfo.outMessage(edit_passwd,CheckPWDActivity.this, "密码内容不符合要求,请检查是否含有中文"); return; } TelephonyManagertm=((TelephonyManager)getSystemService(TELEPHONY_SERVICE)); Stringimei=tm.getDeviceId(); Stringtemp_key=work_key+imei; Stringkey=DataUtil.fillData(temp_key,"1",32); AESUtildes=newAESUtil(key); LoginPwdBeanlogpwdbean=dm.querypwd(); Stringindbpwd=logpwdbean.getPwd(); intfail_count=logpwdbean.getFail_count(); if(fail_count<0||fail_count>=5){ destroyData(); finish(); return; } if(indbpwd!=null&&indbpwd!=""){ StringdeStr=des.encryptStr(passwd); if(deStr.equals(indbpwd)){ dm.updateFailcount(0); IntentpwdlistActivityIntent=newIntent(); BundlemyBundelForName=newBundle(); myBundelForName.putString("work_key",key); pwdlistActivityIntent.putExtras(myBundelForName);pwdlistActivityIntent.setClass(CheckPWDActivity.this,PwdListActivity.class); startActivity(pwdlistActivityIntent); dm.closeDB(); CheckPWDActivity.this.finish(); }else{ intnowfail=logpwdbean.getFail_count()+1; intcount=CheckFailTimes(MAX,nowfail); if(count>0){ OutputInfo.outMessage(edit_passwd,CheckPWDActivity.this, "密码错误,还剩下"+count+"时机"); dm.updateFailcount(nowfail);//更新数据库中的失败次数 }else{ dm.updateFailcount(5); destroyData(); finish(); } return; } }else{ OutputInfo.outMessage(edit_passwd,CheckPWDActivity.this, "数据异常,无法获取登陆密码"); return; } }2)CheckFailTimes()方法具体实现: publicintCheckFailTimes(intmax,intcurent){ if(max<=0||curent<0){ return0; } intret=max-curent; if(ret<0) ret=0; returnret; }3)destroyData()方法具体实现: publicvoiddestroyData(){ booleanret=dm.dropDataBAES(CheckPWDActivity.this); booleanflag=true; try{ FileUtilfile_util=newFileUtil(); StringSDPATH=Environment.getExternalStorageDirectory().getPath(); if(SDPATH!=null) SDPATH=SDPATH+"/"; Stringsource_file=SDPATH+"databackup.sec.data"; file_util.deleteSdcardFile(source_file); }catch(IOExceptionioe){ flag=false; ioe.printStackTrace(); } if(ret&&flag){ OutputInfo.outMessage((EditText)findViewById(R.id.passwd),CheckPWDActivity.this,"个人数据及备份已经销毁!"); }elseif(ret){ OutputInfo.outMessage((EditText)findViewById(R.id.passwd),CheckPWDActivity.this,"账号相关数据已经销毁!"); }else{ OutputInfo.outMessage((EditText)findViewById(R.id.passwd),CheckPWDActivity.this,"数据销毁失败!"); } dm.closeDB();}6.4程序主界面(PwdListActivity)在程序主界面,设计了4个根本功能按钮,分别是“添加工程〞、“修改密码〞、“修改秘钥〞和“备份处理〞。在这四个按钮的下方将会显示数据库中的所有记录概要信息。当点击对应记录之后,将会弹出一个新的窗口进行详细信息的显示。并能够对其进行修改和删除操作。6.5工程信息添加、显示、删除及修改添加:软件工程信息添加功能,将添加的数据使用AES加密处理后存入数据库中,进行数据持久化处理。其中可以添加工程的描述、账号、密码、以及备注等信息。com.sec.Addpwd.java中的add()方法对工程添加逻辑做了完整的实现。代码如下:publicvoidadd(Viewview){ Stringpasswd_desc=((EditText)findViewById(R.id.addpwd_descinput)).getText().toString(); Stringpasswd_account=((EditText)indViewById(R.id.addpwd_accountinput)).getText().toString(); Stringpasswd_first=((EditText)findViewById(R.id.addpwd_pwdinput)).getText().toString(); Stringpasswd_second=(EditText)findViewById(R.id.addpwd_pwdagininput)).getText().toString(); Stringpasswd_bak=((EditText)findViewById(R.id.addpwd_bakinput)).getText().toString(); booleancheck_pwd=DataUtil.passwdfilter(passwd_first); booleancheck_pwd_second=DataUtil.passwdfilter(passwd_first); if(passwd_desc==null||passwd_desc.equals("")){ OutputInfo.outMessage((EditText)findViewById(R.id.addpwd_descinput),Addpwd.this,"工程名称不允许为空"); return; } if(!check_pwd||!check_pwd_second){ OutputInfo.outMessage((EditText)findViewById(R.id.addpwd_pwdinput),Addpwd.this,"密码内容不符合要求,请检查是否含有非法字符"); return; } if(!passwd_first.equals(passwd_second)){ OutputInfo.outMessage((EditText)findViewById(R.id.addpwd_pwdinput),Addpwd.this,"两次输入数据不一致"); return; } AESUtilaes=newAESUtil(work_key); Stringencode_pwd=aes.encryptStr(passwd_first.trim()); PasswdBeanbean=newPasswdBean("",passwd_desc,passwd_account,encode_pwd,passwd_bak); bean.trimBean(); DBManagerdm=PwdListActivity.getDBconn(); booleanret=dm.storePasswd(bean); if(ret){ Addpwd.this.finish(); PwdListActivity.refreshListData(); }else{ OutputInfo.outMessage((EditText)findViewById(R.id.addpwd_descinput),Addpwd.this,"数据保存失败"); return; } }显示:进入软件主界面后,将数据库中存储的数据全部读取出来进行解密,并在主界面上进行显示,当点击某一个条目之后,能后进行更为详细的信息显示,并能够对其进行修改和删除操作。com.sec.ShowInfo.java中的onCreate()方法对工程添加逻辑做了完整的实现。代码如下:protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.show_info); layout=(LinearLayout)findViewById(R.id.showinfo_layout); Intentintent=getIntent(); Bundlebundle=intent.getExtras(); work_key=(String)bundle.getString("work_key"); Stringdb_key=(String)bundle.getString("db_key"); if(work_key==null||db_key==null){ OutputInfo.outMessage(getApplicationContext(),"关键数据异常,无法显示详细信息!"); return; } dm=PwdListActivity.getDBconn(); PasswdBeanbean=dm.query_data_byId(db_key); if(bean==null){ finish(); } TextViewshow_pwd_id=(TextView)findViewById(R.id.show_pwd_id); TextViewshow_pwd_name=(TextView)findViewById(R.id.show_pwd_name); TextViewshow_pwd_account=(TextView)findViewById(R.id.show_pwd_account); TextViewshow_pwd_pwd=(TextView)findViewById(R.id.show_pwd_pwd); TextViewshow_pwd_bak=(TextView)findViewById(R.id.show_pwd_bak); AESUtilaes=newAESUtil(work_key); Stringpassdecode=aes.decryptStr(bean.getPasswd()); show_pwd_id.setText(bean.getKey()); show_pwd_name.setText("工程名称:"+bean.getName()); show_pwd_account.setText("账号:"+bean.getAccount()); show_pwd_pwd.setText("明文密码:"+passdecode); show_pwd_bak.setText("密码描述:"+bean.getBak()); layout.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ Toast.makeText(getApplicationContext(),"提示:点击窗口外部关闭窗口!",Toast.LENGTH_SHORT).show(); } });}删除:在点击某个条目之后,会出现删除账号信息的相关操作。点击删除后,将在数据库中永久地删除该记录。com.sec.ShowInfo.java中的deleteData()方法对工程添加逻辑做了完整的实现。代码如下:publicvoiddeleteData(Viewv){ TextViewshow_pwd_id=(TextView)findViewById(R.id.show_pwd_id); Stringkey=((String)show_pwd_id.getText()).trim(); if(key==null||key==""){ OutputInfo.outMessage(getApplicationContext(),"主键数据获取异常,无法完成修改!"); return; } intresult=dm.deleteDataByKey(key); if(result>0){ OutputInfo.outMessage(getApplicationContext(),"数据删除成功!"); PwdListActivity.refreshListData(); ShowInfo.this.finish(); }else { OutputInfo.outMessage(getApplicationContext(),"数据删除异常!"); ShowInfo.this.finish(); }}修改:在点击某个条目之后,会出现修改账号信息的相关操作。点击修改后,将在新的界面对该条目的具体信息进行修改,包括账号描述、账号、密码已经备注等信息。修改完点击提交按钮后,新的数据将会被加密后更新到数据库中。com.sec.ShowInfo.java中的modifyData()方法对工程添加逻辑做了完整的实现。代码如下:publicvoidmodifyData(Viewv){ TextViewshow_pwd_id=(TextView)findViewById(R.id.show_pwd_id); Stringkey=((String)show_pwd_id.getText()).trim(); if(key==null||key==""){ OutputInfo.outMessage(getApplicationContext(),"主键数据获取异常,无法完成修改!"); return; } Intentintent=newIntent(); BundlemyBundelForName=newBundle(); myBundelForName.putString("work_key",work_key); myBundelForName.putString("db_key",key); intent.putExtras(myBundelForName); intent.setClass(ShowInfo.this,ModifyData.class); startActivity(intent); ShowInfo.this.finish();}6.6用户数据备份及导入考虑到用户可能会有刷机、重置等行为,此类行为会导致手中数据丧失,当然也包括本平台的用户数据。因此为方便用户使用、节省其使用本钱,软件将参加数据备份和恢复的功能。备份:将数据库中的数据进行加密处理后写入到ROM中。在com.sec.BackupImportData.java中提供了备份〔backupData〕的具体实现。代码如下:publicvoidbackupData(Viewview){ArrayList<PasswdBean>bean=PwdListActivity.getDBconn().query_save_data(); Datedate=newDate(System.currentTimeMillis()); SimpleDateFormatsdf=newSimpleDateFormat("yyyy-dd-MMHH:mm:ss",Locale.CHINESE); StringdateStr=sdf.format(date); StringBufferbuff=newStringBuffer(4*1024); buff.append("sec_backupDate:"+dateStr+"\n"); Stringkey=null; for(PasswdBeanpasswdBean:bean){ key=passwdBean.getKey(); buff.append("DataStart_id:"+key+":row_end\n"); buff.append(key+"_name:"+passwdBean.getName()+":row_end\n"); buff.append(key+"_account:"+passwdBean.getAccount()+":row_end\n"); buff.append(key+"_pwd:"+passwdBean.getPasswd()+":row_end\n"); buff.append(key+"_bak:"+passwdBean.getBak()+":row_end\n"); } FileUtilutil=newFileUtil(); Stringsavefilename_temp=SDPATH+"databackup.sec.tmp"; Stringsavefilename=SDPATH+"databackup.sec.data"; try{ util.writeFileSdcardFile(savefilename_temp,buff.toString()); }catch(IOExceptione){ OutputInfo.outMessage((EditText)findViewById(R.id.importbackupdata_input),this,"创立临时文件失败"); e.printStackTrace(); return; } AESUtilaes=newAESUtil(work_key); try{ aes.encryptFile(savefilename_temp,savefilename); }catch(Exceptione){ OutputInfo.outMessage((EditText)findViewById(R.id.importbackupdata_input),this,"加密文件失败"); e.printStackTrace(); return; } try{ util.deleteSdcardFile(savefilename_temp); }catch(IOExceptione){ OutputInfo.outMessage((EditText)findViewById(R.id.importbackupdata_input),this,"加密后删除临时文件失败"); e.printStackTrace(); return; } OutputInfo.outMessage(getApplicationContext(),"数据备份成功");}恢复:考虑到用户数据信息的平安性,在进行恢复时要进行秘钥验证,即备份数据时使用的秘钥。在com.sec.BackupImportData.java中提供了恢复〔backupData〕的具体实现。代码如下:publicvoidimportData(Viewview){ EditTextoriginalEd=(EditText)findViewById(R.id.importbackupdata_input); Stringoriginal_key=originalEd.getText().toString(); if(original_key==null||original_key.trim().equals("")){ OutputInfo.outMessage(originalEd,BackupImportData.this,"秘钥数据不可为空"); return; } if(original_key.getBytes().length>16){ OutputInfo.outMessage(originalEd,BackupImportData.this,"输入数据超长"); return; } booleancheck=DataUtil.isLetterOrDigit(original_key); if(!check){ OutputInfo.outMessage(originalEd,BackupImportData.this,"输入数据不合法,请重新输入"); return; } TelephonyManagertm=((TelephonyManager)getSystemService(TELEPHONY_SERVICE)); Stringimei=tm.getDeviceId(); Stringtemp_key=original_key+imei; Stringkey_old=DataUtil.fillData(temp_key,"1",32); oldWorkKey=key_old; AESUtilaes_old=newAESUtil(key_old); Stringsource_file=SDPATH+"databackup.sec.data"; Stringdest_file=SDPATH+"databackup.sec.temp"; FileUtilfile_util=newFileUtil(); booleanret=file_util.isFileExist(source_file); if(!ret){ OutputInfo.outMessage((EditText)findViewById(R.id.importbackupdata_input),this,"备份文件不存在"); return; } Stringret_data=""; try{ aes_old.decryptFile(source_file,dest_file); ret_data=file_util.readFileSdcardFile(dest_file); if(ret_data.equals("")){ OutputInfo.outMessage((EditText)findViewById(R.id.importbackupdata_input),this,"备份文件无数据"); return; } }catch(IOExceptione){ OutputInfo.outMessage((EditText)findViewById(R.id.importbackupdata_input),this,"读取备份文件内容失败"); e.printStackTrace(); return; }catch(Exceptione){OutputInfo.outMessage((EditText)findViewById(R.id.importbackupdata_input),this,"解密文件失败,请确认秘钥是否正确"); e.printStackTrace(); return; } try{ file_util.deleteSdcardFile(dest_file); }catch(IOExceptione){ OutputInfo.outMessage(getApplicationContext(),"删除解密文件失败,请手动删除"); e.printStackTrace(); return; } Stringdate_temp=ret_data.substring(0,ret_data.indexOf("\n")); Stringdata_usefull=ret_data.substring(ret_data.indexOf("\n")+1); Stringdate=null;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖北黄石市阳新县高中学校校园招聘教师26人备考题库(典优)附答案详解
- 2026国家统计局拉萨调查队招聘2人备考题库含答案详解(培优a卷)
- 2026云南今邦日杂再生资源有限公司招聘业务员1人备考题库【满分必刷】附答案详解
- 2026北京大学力学与工程科学学院招聘1名劳动合同制工作人员备考题库含完整答案详解【名师系列】
- 2026广东广州市天河区东风实验小学招聘小学高年段语文教师备考题库(培优a卷)附答案详解
- 2026云南玉溪市文化馆城镇公益性岗位招聘3人备考题库含答案详解【基础题】
- 2026北京理工大学事业编制相关岗位招聘备考题库【基础题】附答案详解
- 2026山东菏泽市定陶区教体系统引进高层次人才30人笔试参考题库及答案解析
- 2026北京协和医院超声医学科合同制科研助理招聘笔试参考题库及答案解析
- 2026湖北长江产融资本投资有限公司招聘5人备考题库及完整答案详解(各地真题)
- 轿车悬架控制臂参数化建模及轻量化多目标优化设计
- 安庆碧岭220kV输变电工程环境影响报告表
- 隧道工程施工日常安全检查清单
- 口腔医学专业认证标准指标体系-重庆医科大学附属口腔医院
- 2023年湖北中医药大学护理105400专业考研题库(重点400题)
- GB/T 15115-1994压铸铝合金
- GB/T 11351-2017铸件重量公差
- 东西湖两水厂工艺介绍-课件
- 最新上海初三英语首字母填空专项练习
- 2023年萍乡卫生职业学院单招综合素质考试笔试题库及答案解析
- 屋面工程防水施工技术PPT课件(附图丰富)
评论
0/150
提交评论