Android开发中的安全

简介: 根据Android四大框架来解说安全机制   代码安全 java不同于C/C++,java是解释性语言,存在代码被反编译的隐患; 默认混淆器为proguard,最新版本为4.7; proguard还可用来压缩、优化java字节码,删除无用的类、字段、方法、属性、注释等。 配置方法为在Android.mk中设置LOCAL_PROGUARD_FLAG_F

根据Android四大框架来解说安全机制

  •   代码安全

java不同于C/C++java是解释性语言,存在代码被反编译的隐患;
默认混淆器为proguard,最新版本为4.7; proguard还可用来压缩、优化java字节码,删除无用的类、字段、方法、属性、注释等。
配置方法为在Android.mk中设置LOCAL_PROGUARD_FLAG_FILES := proguard.flags
packages/apps/Launcher2/proguard.flags
//特定方法
-keep class com.android.launcher2.Launcher {
  public void previousScreen(android.view.View);
  public void nextScreen(android.view.View);
  public void launchHotSeat(android.view.View);
}
//特定类,“$”表示后面的类是前面的类的内部类
-keep class com.android.launcher2.AllApps3D$Defines {
  *;
}
-keep class com.android.launcher2.ClippedImageView {
  *;
}
  • 接入权限


权限主要用来对应用的操作增加限制,防止恶意应用进行非法操作给用户造成敏感数据泄漏和设备被非法控制,防止恶意收费等;
Android的接入权限
Normal权限
Dangerous权限
signatureOrSystem权限
Signature权限
框架层权限定义位置
frameworks/base/core/res/ AndroidManifest.xml权限可用于整个应用、ActivityService等。
创建接入权限和权限组
<permission android:name=android.permission.GET_ACCOUNTS”   
android:permissionGroup=android.permission-group.ACCOUNTS
android:protectionLevel="normal
android:description=@string/permdesc_getAccounts
android:label="@string/permlab_getAccounts" />

<permission-group android:name=android.permission-group.STORAGE
android:label="@string/permgrouplab_storage
android:description="@string/permgroupdesc_storage" />
  • 应用权限的设置


共享用户ID即共用一个进程
Android源代码树携带的系统证书包括“media”、“platform”、“shared”、“testkey”等,其中“media”证书用于多媒体、下载场景中;“platform”证书用于系统场景中;“shared”证书用于启动器、电话簿场景中;“testkey”证书用于开发场景中,这些证书位于build/target/product/security目录下;
目前支持的“sharedUserId”属性包括“com.android.cts.shareduid”、“com.android.cts.process.uidpid_test”、“android.uid.system”、“com.android.uid.test”、“android.uid.calendar” 、“android.media”、“com.android.framework.externalsharedpermstestapp”、“android.uid.shared”、“android.uid.phone”等。常用的包括“android.uid.system”、“android.media”、“android.uid.shared”等。
设置应用权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
权限验证
Android提供了多个方法可用于验证调用方是否具有相应的权限。
如果调用方拥有相应的权限,则权限验证的返回值为PackageManager. PERMISSION_GRANTED否则返回PackageManager.PERMISSION_DENIED
示例
private int enforceAccessPermission() {
int ret =
mContext.checkCallingOrSelfPermission("android.permission.BIND_WALLPAPER ");
return ret;
}
  • 数字证书


Android的数字证书是免费的,分调试模式和发布模式两种;
通过命令行和Eclipse可以生成发布模式的数字证书;
在命令行方式下利用Keytool来生成数字证书,并利用Jarsigner来为APK进行数字签名;
使用ADT Export Wizard进行签名;
只有同一包名且采用同一数字证书的应用才被认为是同一个应用;
数字证书的最大用途是应用升级和设置应用间通信的权限;
Keytool生成数字证书
keytool -genkey -v -keystore android.keystore -alias miaozl-keyalg RSA -validity 20000
keystore android.keystore”表示生成的证书为“android.keystore”,可以加上路径(默认在用户主目录下);“alias miaozl”表示证书的别名是“miaozl”;“keyalg RSA”表示采用的RSA算法;“validity 20000”表示证书的有效期是20000天。另外通过keypass可以设置数字证书私钥的密码,通过keysize可以设置算法的位长,默认为1024比特,推荐2048比特及更长,通过storepass可以设置证书的密码。
Jarsigner进行数字签名
jarsigner -verbose -keystore android.keystore demo.apk  证书别名
接下来jarsigner会提示输入密钥库的口令和证书别名的口令,全部输入后,即可完成签名
查看数字证书签名
#jarsigner -verify -verbose -certs demo.apk
  • 网络安全


加密算法(敏感数据)
DES(对称)、3DES(对称)、RSA(非对称)、MD5RC2/RC4(对称)、IDEAAESBLOWFISH
Web服务(HTTP层)
三种手段WS-SecuritySSL、数字签名。目前ksoap不支持WS-Security
TCP
SSLTSL
数据链路层
WAPI
  • 数据库安全


Android采用的SQLite目前采用明文存储数据;安全涉及加密、读写、搜索等。
加密方法
加密算法(实现方法参考网上)
权限设置
权限设置
android:permission
android:readPermission
android:writePermission
读写权限示例
<provider
            android:name=".provider.AttachmentProvider"
            android:authorities="com.android.email.attachmentprovider"
            android:multiprocess="true"
            android:grantUriPermissions="true“  
android:readPermission="com.android.email.permission.READ_ATTACHMENT"/>
  • 数据库安全--搜索


<provider android:name="SuggestionsProvider"
            android:readPermission="android.permission.READ_SMS"
            android:authorities="com.android.mms.SuggestionsProvider" >
            <path-permission
                    android:pathPrefix="/search_suggest_query"
                    android:readPermission="android.permission.GLOBAL_SEARCH" />
            <path-permission
                    android:pathPrefix="/search_suggest_shortcut"
                    android:readPermission="android.permission.GLOBAL_SEARCH" />
        </provider>
  • 虚拟机


通常情况下,每个应用均拥有一个虚拟机。
通常情况下,应用间无法相互访问私有数据。
访问数据的方法为:
文件方式
数据库权限开放
配置文件开放
Intent通信
  • 文件访问控制


Android在权限管理上应用了LinuxACLAccess Control List)权限机制,而非早期Unix采用的UGO权限机制。
分区层面
在系统运行时,最外层安全保护是由Linux系统提供的,其中system.img所在的分区是只读的,不允许用户写入,而data.img所在的分区是可读写的,用于存放用户数据。
分区的用户权限在init.rc中定义。
单独文件
单独文件访问权限控制分群组、用户、权限。
权限分可读、可写、可执行。
命令:chown\chgrp\chmod
目录
相关文章
|
1天前
|
Dart IDE Linux
开发Android应用程序
开发Android应用程序
5 1
|
1天前
|
安全 IDE Android开发
探索Android与iOS开发的差异:平台特性与编程实践
【6月更文挑战第17天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据半壁江山。它们在用户群体、系统架构以及开发环境上的差异,为开发者带来了不同的挑战和机遇。本文深入探讨了这两个平台在技术实现、界面设计、性能优化等方面的主要区别,并提供了实用的开发建议,旨在帮助开发者更好地理解各自平台的特性,从而创造出更加优秀的移动应用。
|
2天前
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
4天前
|
安全 Android开发 iOS开发
探索Android与iOS开发的差异:平台特性与用户体验的对比分析
在移动应用开发的广阔天地中,Android和iOS两大阵营各据一方。本文将深入探讨这两个操作系统在开发环境、编程语言、用户界面设计及市场分布等方面的主要区别。通过比较分析,我们将揭示各自平台的特有优势,并讨论如何根据目标受众和业务需求选择适合的开发平台。
|
5天前
|
前端开发 JavaScript Android开发
手机APP开发|基于安卓APP实现掌上党支部——党员app
手机APP开发|基于安卓APP实现掌上党支部——党员app
|
5天前
|
安全 Java Android开发
探索Android与iOS开发的差异与挑战
在移动应用开发的广阔天地里,Android和iOS两大平台各自占据半壁江山。本文将深入探讨这两个平台的开发环境、工具、语言以及设计理念的差异,并分析这些差异给开发者带来的挑战。我们将从多个角度出发,包括用户界面设计、性能优化、安全性考量、以及市场分布等方面,为读者提供一个全面的视角,以理解在这两个平台上进行开发时需要考虑的关键因素。
|
7天前
|
存储 Android开发 Kotlin
Kotlin开发安卓app,在使用 MediaPlayer 播放 res/raw 中的音乐时遇到突然中断的问题,而 onErrorListener 没有接收到任何报错
在使用 Android MediaPlayer 播放 res/raw 中的音乐时遇到中断问题,可能的原因包括资源问题、媒体文件编码格式、生命周期管理和设备资源配置。要排查问题,检查音频文件是否正确包含,格式编码是否支持,MediaPlayer 是否正确管理及释放,以及设备是否有足够存储和配置。通过设置 onErrorListener 日志和确保在 onDestroy 中释放资源来调试。如果文件过大,考虑使用 AssetManager。遵循这些步骤可帮助诊断并解决播放中断的问题。
|
7天前
|
Android开发 Kotlin
kotlin开发安卓应用 如何修改app安装后的名称
在 Android 应用中,要修改安装后的显示名称,需更新 AndroidManifest.xml 文件中 application 标签的 android:label 属性。可直接在该属性内设置新名称,或在 res/values/strings.xml 文件中修改 app_name 并在 manifest 中引用。推荐使用 strings.xml 方式,以便支持多语言和集中管理。
|
7天前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
|
7天前
|
移动开发 安全 Android开发
探索安卓应用开发的新趋势:Kotlin与Jetpack Compose的融合
在移动开发领域,Android系统持续创新,为开发者提供更高效的工具和框架。近年来,Kotlin语言因其简洁性和现代化特性成为Android开发的首选语言。与此同时,Jetpack Compose作为一种新的UI工具集,正改变着Android界面的开发方式。本文将深入探讨Kotlin与Jetpack Compose的结合使用,分析它们如何共同推动Android应用开发进入一个更加高效、可维护和响应式的新时代。