Android应用安全

news/2024/7/3 13:52:09

一、前言

互联网时代,移动应用已经进入到大众生活的各个方面,娱乐、出行、金融、支付等等,应用中包含了用户的各种隐私数据,如聊天记录,金融账户等等敏感数据,以及一些涉及用户个人财产安全的交易支付操作等,所以移动应用的安全性显得尤为重要。作为移动应用开发者我们需要考虑从各个方面最大限度的提高应用的安全性;这篇文章就来讨论一下Andoid应用开发中的安全性问题

二、Android应用的安全

1.组件安全

组件安全是指我们在使用Android提供的组件时,需要做一些访问限制,Activity
,Service,ContentProvider,BroadcastReceiver等
-Activity的安全
正常我们在AndroidManifest.xml中声明Activtiy,如果不做任何配置,其他的应用是可以
通过包名和Activity的完整类名来打开我们应用的这个Activity

           var intent = Intent()
           var componentName = ComponentName(
                "com.example.shareuserdemob", //包名
                "com.example.shareuserdemob.SecondActivity" //完整类名
            );
            intent.component = componentName
            mActivity.startActivity(intent)

为了防止我们的Activity被其他应用恶意启动,我们需要对我们的Activtiy做访问权限控制;
AndroidManifest.xml中通过配置android:exported属性来配置Activity是否可以被其他应用打开,如果设置了android:exported=“false”,则其它应用不能打开启动这个Activity,这里的其它应用是指不同用户ID,不同签名的应用;用户ID相同,签名相同的应用在执行时共享一个进程空间,彼此之间是没有组件访问限制的;
这里用户ID的概念是Linux中的用户ID,默认情况下,Android 会为每个应用分配其唯一用户 ID
我们可以在AndroidManifest.xml中 标签中配置sharedUserId,两个应用的sharedUserId相同,则两个应用拥有相同的用户ID;
这里要注意的是两个应用的sharedUserId配置相同,则两个应用要使用相同的签名文件进行签名,否则一个安装了之后,另外一个无法安装;

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.shareuserdemob"
          android:sharedUserId="com.example.shareuserid" //用户ID名称
         > 
          .....
         </manifest>

两个应用的用户ID一致,则两个应用之间的数据都可以相互访问,没有任何限制; 但是我们如果希望Activity被特定的外部程序启动,就不能设置android:exported=“false”,但是我们可以通过给Activtiy android:permission 设置一个自定义的权限字符串来限定拥有指定权限的应用可以
启动我们的Activity;

-要被启动的目标Activity (应用B中)
AndroidManifest.xml

          <activity
            android:name=".SecondActivity"
            android:permission="permission.open.second.activity"> //设置了权限字符串

            <intent-filter>
                <action android:name="com.example.shareuserdemob.SecondActivity" />
            </intent-filter>
         </activity>   

-要启动应用B中目标Activity的应用中需要配置权限(应用A中)

AndroidManifest.xml

<permission android:name="permission.open.second.activity"/> //定义权限
<uses-permission android:name="permission.open.second.activity" />//使用权限

当然除了Activity,Service,ContentProvider,BroadcastReceiver都是可以通过android:exported
和androi:permission来配置访问权限的;

-BroadcastReceiver的安全

BroadcastReceiver设计的初衷是从全局考虑方便应用程序和系统、应用程序之间、应用程序内的通信,但是对于单个应用程序而言,BroadcastReceiver是存在安全性问题的,比如恶意程序不断的去发送你所接收的广播为了解决这个问题,LocalBroadcastManager就诞生了;
LocalBroadcastManager用于在同一个应用内的不同组件之间发送Broadcast,称之为本地广播管理,安全性高,效率高;
如果我们使用广播是用来实现应用内组件之间的通信的话,可以通过LocalBroadcastManager来注册和发送广播,使用LocalBroadcastManager发送的广播只能被同一应用内的广播接收者接收;这样可以避免其他应用收发你的广播带来的安全问题;

2.通信安全

在大多数的移动应用中会涉及到网络通信,所以通信安全也是非常重要的;如使用HTTPS/WSS 加密通信协议来替代HTTP和WS协议,来防止通信被中间人劫持以及通信数据的泄露,对通信的敏感数据如密码等进行加密后再进行网络传输

3.APK的安全

APK的安全是非常重要的,因为通过APK反编译,可以看到我们的代码实现,窃取我们的代码逻辑,通过修改代码,二次打包,可以篡改我们的代码逻辑,也会造成严重的问题;
所以如何避免APK被反编译,以及增加APK被反编译之后阅读的难度,提高APK的安全性

-对代码进行混淆

使用Android提供的proguard混淆器混淆代码来增加反编译之后代码的阅读难度;

-对APK进行加固

我们可以使用一些加固工具,如360加固,腾讯加固来对APK进行加固,防止APK被反编译;
免费的加固服务一般只提供Dex文件加固,防止二次打包;不支持so包加固,资源文件保护,so包加固,资源文件保护一般都是需要收费提供服务;

4.本地数据安全

-数据加密
对于应用本地保存的一些敏感数据,如密码,聊天记录等,都需要加密后保存;本地数据库中保存的敏感数据,我们需要加密后保存,或者对SQLite数据库整体进行加密(SQliteCipher对SQLite数据库文件进行加密)

5.数据备份安全

AndroidManifest.xml中的application中可以配置android:allowBackup 属性来设置是否允许
应用进行数据备份以及数据恢复,默认为true,允许进行备份,设置false则不允许进行备份和数据恢复;默认为true,允许进行备份,设置false则不允许进行备份和数据恢复默认设置为true的情况下,则只要打开调试模式,通过adb backup命令就可以备份设备中的该应用的数据,然后在另外一台设备中,我们安装该应用,然后通过 adb restore命令就可以恢复该应用数据
allowBackup备份的数据有:
SharedPreferences数据
应用内部存储数据 /data/data/应用包名下的数据
应用的外部存储数据 getExternalFilesDir("")目录下的文件
应用数据库中的数据

所以如果开启了allowBackup,则通过adb backup命令就可以恢复数据,在另外一个设备中安装了该应用, 就可以将应用数据恢复到到备份的状态,还是有很大的安全问题的,所以一般都需要将allowBackup关闭;一般的应用安全检测检测到allowBackup没有设置false,也会报高危漏洞警告的;

备份应用数据

adb backup -f back.ab -noapk 应用包名

恢复应用数据

adb restore back.ab

6.截屏安全

对于一些敏感页面,如密码登录页面,支付交易密码输入页面,像付款二维码页面,这样
页面我们都需要考虑可能会被截屏的风险,所以我们需要在APP的部分页面中设置禁止截屏
禁止截屏设置需要在Activity的setContentView之前进行如下设置

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)

以上就是Android应用开发中一些需要注意的安全问题,我们在开发过程中需要严格遵守这些安全规范,提高应用的安全性,保护用户的数据财产安全;


http://www.niftyadmin.cn/n/1965492.html

相关文章

Ubuntu使用Jenkins配置自动化打包Android APK

一、前言 我们开发好功能之后&#xff0c;需要编译打包&#xff0c;打包好的可执行程序需要交给测试人员进行测试&#xff0c;但是往往我们的项目大了之后&#xff0c;编译整个项目&#xff0c;打包的过程的时间相对比较长&#xff0c;这个时候如果是在开发人员的电脑上进行代…

与Waymo对簿公堂的Uber自动驾驶长途货车,Uber Freight终于亮相

要知道&#xff0c;Uber与从谷歌独立出来的Waymo之间的官司还未结束。 上周末&#xff0c;Uber CEO卡兰尼克过的肯定十分充实&#xff0c;因为通过社交平台不难看出&#xff0c;他和汤姆布拉迪在肯塔基赛马会上玩乐之后在匹兹堡稍作停留&#xff0c;还拍下一台侧身印着“Uber …

MyBatis动态设置要连接的数据库地址,用户名,密码

一、前言 使用Mybatis连接数据库&#xff0c;可能一般我们都是在MyBatis的全局配置文件中去进行配置要连接数据库的url,用户名&#xff0c;密码&#xff0c;但是我们有的时候会有需要动态设置要连接的数据库url&#xff0c;用户名&#xff0c;密码的需求&#xff0c;比如我们可…

TCP/IP学习(30)——L2数据链路层的数据包处理详细流程

原文地址&#xff1a;TCP/IP学习(30)——L2数据链路层的数据包处理详细流程 作者&#xff1a;GFree_Wind 本文的copyleft归gfree.windgmail.com所有&#xff0c;使用GPL发布&#xff0c;可以自由拷贝&#xff0c;转载。但转载请保持文档的完整性&#xff0c;注明原作者及原链接…

一次性搞清楚equals和hashCode

在程序设计中&#xff0c;有很多的“公约”&#xff0c;遵守约定去实现你的代码&#xff0c;会让你避开很多坑&#xff0c;这些公约是前人总结出来的设计规范。 Object类是Java中的万类之祖&#xff0c;其中&#xff0c;equals和hashCode是2个非常重要的方法。 这2个方法总是被…

硬科技企业大放异彩,Nibiru、柔宇斩获国家优质投资项目特别奖

2016—2017年度国家优质投资项目推介表彰大会在京举行。 近日&#xff0c;由国家发展改革委主管&#xff0c;中国投资协会主办的2016—2017年度国家优质投资项目推介表彰活动的审定结果在北京钓鱼台国宾馆揭晓。中国投资协会会长杨庆蔚&#xff0c;中国投资协会副会长、创投委…

VirtualBox虚拟机Ubuntu设置共享文件夹,并自动挂载

一、环境 Win10系统&#xff0c;VirtualBox-5.1.22-115126Ubuntu16.04&#xff08;64位&#xff09;虚拟机二、目的在Ubuntu中能够共享Win10中的某个文件夹&#xff0c;而且能够自动挂载三、设置共享文档夹1) 安装好Ubuntu后&#xff0c;运行并登录2) 点击"设备(Devices) …

笨方法学习Python31-40

31、作出决定复习了raw_input("> ")if 变量 "Vaule":执行语句32、循环和列表count [1, 2, 3, 4, 5]for i in count:print "This is %d" % i #循环打印出count的值count.append(6) #从最后增加值count.insert(1,44) #从第…