<menuitem id="jdrvb"><strike id="jdrvb"></strike></menuitem>
<cite id="jdrvb"></cite>
<cite id="jdrvb"></cite>
<var id="jdrvb"></var>
<cite id="jdrvb"></cite>
<var id="jdrvb"><video id="jdrvb"><menuitem id="jdrvb"></menuitem></video></var><var id="jdrvb"></var>
<cite id="jdrvb"></cite>
<var id="jdrvb"><video id="jdrvb"></video></var>
<cite id="jdrvb"></cite>
<ins id="jdrvb"><span id="jdrvb"><menuitem id="jdrvb"></menuitem></span></ins>
您現在的位置: 弘智首頁 > Android > android資料下載 >

Android的安全與權限

時間:2012-10-29 12:38 來源:弘智培訓
Android是一個多進程系統,每一個應用程序(和系統的組成部分)都運行在自己的進程中。在應用程序和系統間的安全通過標準的Linux設備在進程級被執行,例如被分配給應用程序的用戶和組ID。額外的細粒度安全特性通過“許可”機制來提供,該機制能夠對一個指定進程可實現的特定操作進行約束。

安全結構

Android安全學中的一個重要的設計點是在默認情況下應用程序沒有權限執行對其它應用程序、操作系統或用戶有害的操作。這些操作包括讀/寫用戶的隱私數據(例如聯系方式或e-mail),讀/寫其它應用程序的文件,執行網絡訪問,保持設備活動,等等。
應用程序的進程是一個安全的沙箱。它不能干擾其它應用程序,除非在它需要添加原有沙箱不能提供的功能時明確聲明權限。這些權限請求能夠被不同方式的操作所處理,特別的要基于證書和用戶的提示被自動的允許或禁止。權限的請求在那個應用程序中通過一個應用程序被聲明為靜態的,所以在此之后在安裝時或沒有改變時它們會預先知道。

應用程序簽名

所有的Android應用程序(.apk文件)必須通過一個證書的簽名,此證書的私鑰必須被開發者所掌握。這個證書的標識是應用程序的作者。這個證書需要通過證書組織的簽署:Android應用程序對于使用自簽署的證書是完全允許的和特別的。這個證書僅僅被用于與應用程序建立信任關系,不是為了大規模的控制應用程序可否被安裝。最重要的方面是通過確定能夠訪問原始簽名權限和能夠共享用戶ID的簽名來影響安全。

用戶標識和文件訪問

安裝在設備中的每一個Android包文件(.apk)都會被分配給一個屬于自己的統一的Linux用戶ID,并且為它創建一個沙箱以防止影響其它應用程序(或者其它應用程序影響它)。用戶ID 在應用程序安裝到設備中時被分配,并且在這個設備中保持它的永久性。
因為安全執行發生在進程級,所以一些不同包中的代碼在相同進程中不能正常的運行,自從他們需要以不同Linux用戶身份運行時。你可以使用每一個包中的AndroidManifest.xml文件中的manifest 標簽屬性sharedUserId 擁有它們分配的相同用戶ID。通過這樣做,兩個包被視為相同的應用程序的安全問題被解決了,注意為了保持安全,僅有相同簽名(和請求相同sharedUserId標簽)的兩個應用程序簽名將會給相同的用戶ID。
應用創建的任何文件都會被賦予應用的用戶標識,并且,正常情況下不能被其它包訪問。當你通過getSharedPreferences(String, int), openFileOutput(String, int) 或者 openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory)創建一個新文件時, 你可以同時或分別使用 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 標志允許其它包讀/寫此文件。當設置了這些標志時,這個文件仍然屬于你的應用程序,但是它的全局讀、寫和讀寫權限已經設置所以其它任何應用程序可以看到它。

權限命名

一個基本的Android應用程序沒有與其相關聯的權限,意味著它不能做任何影響用戶體驗或設備中的數據的有害操作。要利用這個設備的保護特性,在你的應用程序需要時,你必須在AndroidManifest.xml文件中包含一個或更多的<uses-permission> 標簽來聲明此權限。
例如:需要監聽來自SMS消息的應用程序將要指定如下內容:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.app.myapp" >
 
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
 
</manifest>
在安裝應用程序時,通過包安裝器應用程序要通過權限請求的許可,使建立在與應用程序簽名的核對下聲明對于用戶的那些權限和影響。在應用運行期間對用戶不做檢查:它要么在安裝時被授予特定的許可,并且使用想用的特性;要么不被授予許可,并且使得一切使用特性的嘗試失敗而不提示用戶。
例如,sendBroadcast(Intent) 方法就是當數據被發送給到每個接收器時檢查許可的,在方法調用返回之后,因此當許可失敗時你不會收到一個異常。然而,幾乎在所有例子中,許可失敗都會被打印到系統日志中。通常,多次的許可錯誤會產生拋回至應用程序的SecurityException異常。
Android系統提供的許可可以在Manifest.permission中找到。每個引用也可以定義和Enforce它自己的許可,因此這不是全面的所有可能的列表。
在程序操作期間,個別權限在一些地方可能被強制:
·在系統接到呼叫的時候,預防一個應用程序去執行特定的函數。
·在啟動Activity時,防止一個應用啟動其它應用程序的Activities。
·發送和接收Intent廣播時,控制誰能接收你的廣播或者誰能發送廣播給你。
·在一個內容提供器上訪問和操作時。
·綁定或開始一個服務時。

權限的聲明和支持

為了執行你自己的權限,你必須首先在你的AndroidManifest.xml中使用一個或多個<permission> 標簽聲明它們。
例如,一個應用程序想用控制誰能啟動一個activities,它可以為聲明一個做這個操作的許可,如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.me.app.myapp" >
 
    <permission android:name="com.me.app.myapp.permission.DEADLY_ACTIVITY"
        android:label="@string/permlab_deadlyActivity"
        android:description="@string/permdesc_deadlyActivity"
        android:permissionGroup="android.permission-group.COST_MONEY"
        android:protectionLevel="dangerous" />
 
</manifest>
<protectionLevel> 屬性是必需的,告訴系統用戶應如何處理應用程序接到請求此權限的通知,或者在這個文檔中對這個權限的許可的描述。
<permissionGroup> 屬性是可選的,僅僅用于幫助系統為用戶顯示權限。通常,你要設置這些,向一個標準的系統組(列在android.Manifest.permission_group中),或者在更多的情況下要自定義。它更偏向于使用一個已經存在的組,做為簡化的權限用戶界面顯示給用戶。
注意:應該為每個權限提供標簽(label) 和描述(description)。當用戶瀏覽權限列表時,它們可以為用戶展示字符資源,如(android:label) 或者一個許可的詳細信息 ( android:description) 。標簽(label)比較短,用幾個詞來描述該權限保護的關鍵功能。描述(description)應該是一組句子,用于描述獲得權限的用戶可以做什么。我們寫描述的習慣是兩句話,第一句聲明權限,第二句警告用戶如果應用許可該權限時,會發生什么不好的事情。
下面是一個CALL_PHONE權限的標簽和描述的例子:
    <string name="permlab_callPhone">directly call phone numbers</string>
    <string name="permdesc_callPhone">Allows the application to call
        phone numbers without your intervention. Malicious applications may
        cause unexpected calls on your phone bill. Note that this does not
        allow the application to call emergency numbers.</string>
你可以在系統中通過shell命令 adb shell pm list permissions查看權限當前定義。特別,'-s'  操作以簡單粗略的方式為使用者顯示權限:
$ adb shell pm list permissions -s     
All Permissions:
 
Network communication: view Wi-Fi state, create Bluetooth connections, full
Internet access, view network state
 
Your location: access extra location provider commands, fine (GPS) location,
mock location sources for testing, coarse (network-based) location
 
Services that cost you money: send SMS messages, directly call phone numbers
 
...

AdroidManifest.xml文件中支持權限

通過 AndroidManifest.xml 文件可以設置高級權限,以限制訪問系統的所有組件或者使用應用程序。所有的這些請求都包含在你所需要的組件中的 android:permission屬性,命名這個權限可以控制訪問此組件。
Activity 權限 (使用 <activity> 標簽) 限制能夠啟動與 Activity 權限相關聯的組件或應用程序。此權限在 Context.startActivity() 和 Activity.startActivityForResult() 期間要經過檢查;如果調用者沒有請求權限,那么會為調用拋出一個安全異常( SecurityException )。
Service 權限(應用 <service> 標簽)限制啟動、綁定或啟動和綁定關聯服務的組件或應用程序。此權限在 Context.startService(), Context.stopService() 和 Context.bindService() 期間要經過檢查;如果調用者沒有請求權限,那么會為調用拋出一個安全異常( SecurityException )。
BroadcastReceiver 權限(應用 <receiver> 標簽)限制能夠為相關聯的接收者發送廣播的組件或應用程序。在 Context.sendBroadcast() 返回后此權限將被檢查,同時系統設法將廣播遞送至相關接收者。因此,權限失敗將會導致拋回給調用者一個異常;它將不能遞送到目的地。在相同方式下,可以使 Context.registerReceiver() 支持一個權限,使其控制能夠遞送廣播至已登記節目接收者的組件或應用程序。其它的,當調用 Context.sendBroadcast() 以限制能夠被允許接收廣播的廣播接收者對象一個權限(見下文)。
ContentProvider 權限(使用 <provider> 標簽)用于限制能夠訪問 ContentProvider 中的數據的組件或應用程序。(Content providers 有一個重要的附加安全設施可用于它們調用被描述后的URI權限。) 不同于其它組件,它有兩個不相連系的權限屬性要設置:android:readPermission 用于限制能夠讀取提供器的組件或應用程序, android:writePermission 用于限制能夠寫入提供器的組件或應用程序。注意,如果一個提供者的讀寫權限受保護,意思是你只能從提供器中讀,而沒有寫權限。當你首次收回提供者(如果你沒有任何權限,將會拋出一個SecurityException異常),那么權限要被檢查,并且做為你在這個提供者上的執行操作。 使用 ContentResolver.query() 請求獲取讀權限; 使用 ContentResolver.insert(), ContentResolver.update() 和 ContentResolver.delete() 請求獲取寫權限。在所有這些情況下,一個SecurityException異常從一個調用者那里拋出時不會存儲請求權限結果。

播時支持權限

當發送一個廣播時你能總指定一個請求權限,此權限除了權限執行外,其它能發送Intent到一個已注冊的BroadcastReceiver 的權限均可以。 通過調用 Context.sendBroadcast() 及一些權限字符串, 為了接收你的廣播,你請求一個接收器應用程序必須持有那個權限。
注意,接收者和廣播者都能夠請求一個權限。當這樣的事發生了,對于Intent來說,這兩個權限檢查都必須通過,為了交付到共同的目的地。

其他權限支持

任意一個好的粒度權限都能夠在一些調用者的一個服務中被執行。 和 Context.checkCallingPermission() method. 方法一起被完成。調用并產生一個需要的權限字符串,它將返回一個整型,以確定當前調用進程是否被許可。注意,僅僅當你執行的調用進入到其它進程的時候這些才會被使用,通常,通過IDL接口從一個服務發布,或從一些其它方式通知其它進程。
這有許多其它有益的方式去檢查權限。如果你有一個其它進程的PID,你可以使用上下文的方法 Context.checkPermission(String, int, int) 檢查權限違反PID。 如果你有一個其它應用程序的包名, 你可以使用直接的包管理器方法 PackageManager.checkPermission(String, String) 去查看特定的包是否被指定的權限所許可。

URL權限

迄今為止,在與內容提供器共同使用時,標準權限系統描述通常是不充分的。一個內容提供器要保護它自己及讀和寫權限,當為了它們產生作用,它的直接客戶端總是需要手動的對其它應用程序指定URI。一個典型的例子是郵件應用程序中的附件。訪問郵件的權限應該被保護,因為這是敏感用戶數據?梢,如果一個網址圖片附件提供給一個圖片查看器,那個圖片查看器將沒有權限打開這個附件,因為它沒有原因去擁有一個權限從而不能訪問所有的電子郵件。
對于這個問題的解決是通過網址權限:當開始一個活動或對一個活動返回一個結果,調用者可通過設置Intent.FLAG_GRANT_READ_URI_PERMISSION 和Intent.FLAG_GRANT_WRITE_URI_PERMISSION 中的一個或者兩個。允許接收活動權限訪問在Intent中特定的數據地址,不論它有權限訪問數據在內容提供器相應的Intent中。
這種機制允許一個公用的功能性模型使用戶相互交互(打開一個附件,從一個列表中選擇一個聯系人,等等)驅動ad-hoc在優粒度權限的許可下。這可能是一個主要設備,應用程序為了減少這個權限而需要,僅僅直接關系到它們的行為。
這優粒度URI權限的許可工作,然而,請求一些協作和內容提供者保持那些URI。強烈推薦內容提供者實現這種設備,并且通過android:grantUriPermissions 屬性或者 <grant-uri-permissions> 標簽聲明支持它。
更多信息可以在Context.grantUriPermission(), Context.revokeUriPermission(), 和 Context.checkUriPermission() 方法中找到。
主頁 | 我們介紹 | 我們課程 | 開課公告 | 無錫學歷培訓 | XML地圖
欧美三级电影,欧美大尺度电影
<menuitem id="jdrvb"><strike id="jdrvb"></strike></menuitem>
<cite id="jdrvb"></cite>
<cite id="jdrvb"></cite>
<var id="jdrvb"></var>
<cite id="jdrvb"></cite>
<var id="jdrvb"><video id="jdrvb"><menuitem id="jdrvb"></menuitem></video></var><var id="jdrvb"></var>
<cite id="jdrvb"></cite>
<var id="jdrvb"><video id="jdrvb"></video></var>
<cite id="jdrvb"></cite>
<ins id="jdrvb"><span id="jdrvb"><menuitem id="jdrvb"></menuitem></span></ins>