根据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
权限可用于整个应用、
Activity
、
Service
等。
创建接入权限和权限组
<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
(非对称)、
MD5
、
RC2/RC4
(对称)、
IDEA
、
AES
、
BLOWFISH
等
Web
服务(
HTTP
层)
三种手段
WS-Security
、
SSL
、数字签名。目前
ksoap
不支持
WS-Security
TCP
层
SSL
、
TSL
数据链路层
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
在权限管理上应用了
Linux
的
ACL
(
Access Control List
)权限机制,而非早期
Unix
采用的
UGO
权限机制。
分区层面
在系统运行时,最外层安全保护是由
Linux
系统提供的,其中
system.img
所在的分区是只读的,不允许用户写入,而
data.img
所在的分区是可读写的,用于存放用户数据。
分区的用户权限在
init.rc
中定义。
单独文件
单独文件访问权限控制分群组、用户、权限。
权限分可读、可写、可执行。
命令
:chown\chgrp\chmod
。