您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
Android安全机制探讨
 
作者:小瓶盖_tl 来源:博客 发布于:2016-8-17
  1911  次浏览      17
 

今天我们不聊代码,聊聊我们的安卓本身。

近几年,Android操作系统的发展极其迅猛,基于Android终端市场占有率和出货量节节攀升。随着互联网时代的到来,Android已经融入了我们的生活。与Android市场繁荣的同时存在的,是Android的安全问题日益突出,各种隐私泄露,信息丢失,恶意扣费,系统入侵屡见不鲜。针对Android安全的研究十分紧迫和必要。


Android的安全范畴主要包括硬件、通信、软件、信息四大方面。本文将在Android框架的基础之上,重点对软件进行探讨。

先看看Andrid的框架,如图:

这是一个经典的Android框架图,很多人都见过,我先简要的概括一下这些信息,Android采用分层的系统架构,由下往上分别是linux内核层、硬件抽象层、系统运行时库层、应用程序框架层和应用程序层。

Android以Linux操作系统内核为基础,实现硬件设备驱动、进程和内存管理、网络协议栈、电源管理等核心系统功能。除此以外,Android还增加了一些面向移动设备的特有功能,如低内存管理LMK(Low Memory Killer)、匿名共享内存(Ashmem: Anonymous Shared Memory),以及进程间通信Binder机制。这些功能的增强进一步提升了Android在内存管理、进程间通信等方面的安全性。

Android之前的版本并不存在硬件抽象层。鉴于硬件厂商并不希望公开其设备驱动的源代码,Google对此将Linux内核驱动程序进行封装,屏蔽掉底层的实现细节,向上提供统一的接口,这就是硬件抽象层。

接下来进入今天的主题。

首先说说应用层安全问题:

1.代码安全

a、Java不同于C/C++,java是解释性语言,存在代码被反编译的隐患;

b、默认混淆器为proguard,最新版本为4.7; proguard还可用来压缩、优化java字节码,删除无用的类、字段、方法、属性、注释等。

c、配置方法为在Android.mk中设置:LOCAL_PROGUARD_FLAG_FILES := proguard.flags

d: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 {
*;
}

2、接入权限

a、权限主要用来对应用的操作增加限制,防止恶意应用进行非法操作给用户造成敏感数据泄漏和设备被非法控制,防止恶意收费等;

b、Android的接入权限

(1)Normal权限

(2)Dangerous权限

(3)signatureOrSystem权限

(4)Signature权限

c、框架层权限定义位置

(1)frameworks/base/core/res/ AndroidManifest.xml

d、权限可用于整个应用、Activity、Service等。

3、创建接入权限和权限组

<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" />

 

4、应用权限的设置

a、共享用户ID即共用一个进程

(1)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”等。

b、设置应用权限

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

5、权限验证

a、Android提供了多个方法可用于验证调用方是否具有相应的权限。

b、如果调用方拥有相应的权限,则权限验证的返回值为PackageManager. PERMISSION_GRANTED否则返回PackageManager.PERMISSION_DENIED。

c、示例

private int enforceAccessPermission() {
int ret =
mContext.checkCallingOrSelfPermission("android.permission.BIND_WALLPAPER ");
return ret;
}

聊完了应用层的内容,再看看应用框架层的内容。

1、数字证书

a、Android的数字证书是免费的,分调试模式和发布模式两种;

b、通过命令行和Eclipse可以生成发布模式的数字证书;在命令行方式下利用Keytool来生成数字证书,并利用Jarsigner来为APK进行数字签名;使用ADT Export Wizard进行签名;

c、只有同一包名且采用同一数字证书的应用才被认为是同一个应用;

d、数字证书的最大用途是应用升级和设置应用间通信的权限;

2、Keytool生成数字证书

keytool -genkey -v -keystore android.keystore -alias miaozl-keyalg RSA -validity 20000

a、“keystore android.keystore”表示生成的证书为“android.keystore”,可以加上路径(默认在用户主目录下);“alias miaozl”表示证书的别名是“miaozl”;“keyalg RSA”表示采用的RSA算法;“validity 20000”表示证书的有效期是20000天。另外通过keypass可以设置数字证书私钥的密码,通过keysize可以设置算法的位长,默认为1024比特,推荐2048比特及更长,通过storepass可以设置证书的密码。

3、Jarsigner进行数字签名

jarsigner -verbose -keystore android.keystore demo.apk  

接下来jarsigner会提示输入密钥库的口令和证书别名的口令,全部输入后,即可完成签名

4、查看数字证书签名

#jarsigner -verify -verbose -certs demo.apk

再看看网络安全问题:

1、加密算法(敏感数据)

a、DES(对称)、3DES(对称)、RSA(非对称)、MD5、RC2/RC4(对称)、IDEA、AES、BLOWFISH等

2、Web服务(HTTP层)

a、三种手段WS-Security、SSL、数字签名。目前ksoap不支持WS-Security

3、TCP层

a、SSL、TSL

4、数据链路层

a、WAPI

然后及时数据库的安全问题:

1、Android采用的SQLite目前采用明文存储数据;安全涉及加密、读写、搜索等。

2.加密方法

a、加密算法(实现方法参考网上)

b、权限设置

3、权限设置

android:permission
android:readPermission
android:writePermission

4、读写权限示例

<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"/>

5、数据库安全–搜索

<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>

再看看我们的虚拟机:

1、通常情况下,每个应用均拥有一个虚拟机。

2、通常情况下,应用间无法相互访问私有数据。

3、访问数据的方法为:

a、文件方式

b、数据库权限开放

c、配置文件开放

d、Intent通信

还有最后一个内容:

文件访问控制

1、Android在权限管理上应用了Linux的ACL(Access Control List)权限机制,而非早期Unix采用的UGO权限机制。

2、分区层面

a、在系统运行时,最外层安全保护是由Linux系统提供的,其中system.img所在的分区是只读的,不允许用户写入,而data.img所在的分区是可读写的,用于存放用户数据。
分区的用户权限在init.rc中定义。

3、单独文件

a、单独文件访问权限控制分群组、用户、权限。

b、权限分可读、可写、可执行。

c、命令:chown\chgrp\chmod。

以上就是文章的全部内容,这是从大范围的角度来看,在以后的文章中,我会通过代码来具体呈现。谢谢大家的阅读。

 

   
1911 次浏览       17
 
相关文章

手机软件测试用例设计实践
手机客户端UI测试分析
iPhone消息推送机制实现与探讨
Android手机开发(一)
 
相关文档

Android_UI官方设计教程
手机开发平台介绍
android拍照及上传功能
Android讲义智能手机开发
相关课程

Android高级移动应用程序
Android系统开发
Android应用开发
手机软件测试
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]

android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   


Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...