Android的安全性和許可權(Security and Permission)(一)

來源:互聯網
上載者:User

本文檔嚮應用開發人員介紹如何使用Android提供的安全行特徵。

Android是一個特權分離的作業系統,在系統中啟動並執行每個應用程式都有一個區分系統標識(Linux使用者ID和分組ID)。標識的系統部分也被區分不同的身份。因而Linux能夠把應用程式以及系統進行彼此分離。

另外,更細粒度的安全特徵是通過“許可權”機制來提供的,這種機制強制限制了特殊進程所能執行的具體操作,並且給每個URI都設定了方位具體資料片段的許可權。

安全架構

Android安全架構的核心設計點是,預設的情況下,沒有任何應用程式有權來執行能夠對其他應用程式、作業系統或使用者帶來不利影響的任何操作。包括讀寫使用者的私人資料(如通訊錄或e-mail)、讀寫另一個應用程式的檔案、執行網路訪問、保持裝置的喚醒狀態等等。

因為Android用沙箱來分離每個應用程式,因此應用程式必須明確要共用的資源和資料。應用程式通過聲明來擷取它們所需要的基本沙箱所不具備的額外能力。應用程式靜態聲明它們所需要的許可權,並且Android系統會在安裝應用程式時,提示應用程式來同意。Android沒有動態(在運行時)授權機制,因為安全的損害會給使用者帶來複雜的使用者體驗。

應用程式沙箱不依賴用於構建應用程式的技術。特別是在Dalvik虛擬機器中是沒有安全邊界的,並且任何應用程式都能運行機器碼。所有類型的應用程式,包括Java、原生的以及混合的應用程式,都以相同的方式被放在沙箱中,它們彼此都有相同的安全程度。

應用程式簽名

所有的Android應用程式(.apk檔案)都必須用一個認證來進行簽名,認證的私人鍵被應用的開發人員所持有。這個認證標識了應用程式的作者,它不需要由認證授權機構來簽署,這是完全允許的,並且通常Android應用都使用自我簽署憑證。Android中認證的目的是區分應用程式的作者。這樣就允許系統接受或拒絕應用程式訪問簽名層級的許可權,以及接受或拒絕應用程式要求獲得與另一個應用程式相同的Linux身份的請求。

使用者ID和檔案訪問

在安裝時,Android系統會給每個包分配一個不同的Linux使用者ID。這個身份標識對於裝置上處於運行期間的包會保持不變。在不同的裝置上,同樣的包可能會有不同的UID,這不重要,重要的是在一個裝置上,每個包要有不同的UID。

因為安全是在進程層級上強制發生的,任何兩個包的代碼通常不會運行在同一個進程中,因此它們需要用不同的Linux使用者來運行。能夠在每個包的Androidmanifest.xml檔案中的<manifest>標籤中使用sharedUserId屬性,來給它們分配相同的使用者ID。通過這樣做,這些設定了相同使用者ID的包會被視為同一個應用程式,並具有相同的許可權。要注意的時,為了保留安全性,只有使用了相同的簽名的應用程式(並且申請了相同的sharedUserId屬性)才會給分配相同的使用者ID。

應用程式儲存的任何資料,都會把應用的使用者ID分配給它,並且通常其他的包不能訪問它。當用getSharedPreferences(String, int)、openFileOutput(String, int)或openOrCreateDatabase(String, int, SQLiteDatabase.CureorFactory)等方法建立一個新的檔案時,能夠使用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>

在應用程式安裝時,應用程式申請的許可權會通過Android的包安裝器來授予,包安裝器通過應用程式聲明的許可權和(或)跟使用者進行互動來檢查是否應該將對應的許可權授予該應用程式。在應用程式運行是,它不會檢查許可權。也就是說,要麼在安裝時就給應用程式授予其所申請的許可權,使其能夠使用這些許可權所限定的功能,要麼不批准其所申請的許可權,使其不能使用這些許可權所限定的功能,並使用者也不會得到任何提示。

很多時候,由於沒有許可權而導致的失敗,會給應用程式拋出一個SecurityException異常。但是並不保證沒有許可權的任何地方都會發生這個異常。例如,sendBroadcast(Intent)方法在發送資料時,會檢查每個接受器的許可權,這個方法調用返回之後,如果有許可權失敗的情況,也不會收到異常。但是,在幾乎所有的場合,許可權相關的失敗會列印一個系統級日誌(log)。

由Android系統提供的許可權能夠在Manifest.permission類中找到。任何應用程式還可以定義和強制實施它自己的許可權,因此這個類中列出的不是所有的可能的許可權。

在程式的執行過程中,可在很多地方強制實施一個特殊的許可權:

1. 在系統調用的時候,阻止應用程式執行某些功能;

2. 在Activity啟動時,阻止其他應用程式的Activity來啟動本應用;

3. 在發送和接收廣播時,控制誰能接收你的廣播或誰能給你發送廣播;

4. 在訪問並操作一個內容提供器時;

5. 綁定或啟動服務的時候。

 

摘自 FireOfStar的專欄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.