Android应用安全
Posted 殇神马
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android应用安全相关的知识,希望对你有一定的参考价值。
一、前言
互联网时代,移动应用已经进入到大众生活的各个方面,娱乐、出行、金融、支付等等,应用中包含了用户的各种隐私数据,如聊天记录,金融账户等等敏感数据,以及一些涉及用户个人财产安全的交易支付操作等,所以移动应用的安全性显得尤为重要。作为移动应用开发者我们需要考虑从各个方面最大限度的提高应用的安全性;这篇文章就来讨论一下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应用开发中一些需要注意的安全问题,我们在开发过程中需要严格遵守这些安全规范,提高应用的安全性,保护用户的数据财产安全;
以上是关于Android应用安全的主要内容,如果未能解决你的问题,请参考以下文章