代碼安全
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" />
android:pathprefix="/search_suggest_shortcut"
</provider>
虛拟機
通常情況下,每個應用均擁有一個虛拟機。
通常情況下,應用間無法互相通路私有資料。
通路資料的方法為:
檔案方式
資料庫權限開放
配置檔案開放
intent通信
檔案通路控制
android在權限管理上應用了linux的acl(access
control list)權限機制,而非早期unix采用的ugo權限機制。
分區層面
在系統運作時,最外層安全保護是由linux系統提供的,其中system.img所在的分區是隻讀的,不允許使用者寫入,而data.img所在的分區是可讀寫的,用于存放使用者資料。
分區的使用者權限在init.rc中定義。
單獨檔案
單獨檔案通路權限控制分群組、使用者、權限。
權限分可讀、可寫、可執行。
指令:chown\chgrp\chmod。