Android 安全訪問機制

來源:互聯網
上載者:User

概述:

Android是一個多進程系統,在這個系統中,應用程式(或者系統的部分)會在自己的進程中運行。系統和應用之間的安全性通過Linux的facilities(工具,功能)在進程層級來強制實現的,比如會給應用程式分配user ID和Group ID。更細化的安全特性是通過"Permission"機制對特定的進程的特定的操作進行限制,而"per-URI permissions"可以對擷取特定資料的access專門許可權進行限制。 所以,應用程式之間的一般是不可以互相訪問的,但是anroid提供了一種permission機制,用於應用程式之間資料和功能的安全訪問。

一 . 安全架構

Android安全架構中一個中心思想就是:應用程式在預設的情況下不可以執行任何對其他應用程式,系統或者使用者帶來負面影響的操作。這包括讀或寫使用者的私人資料(如連絡人資料或email資料),讀或寫另一個應用程式的檔案,網路連接,保持裝置處於非睡眠狀態。

一個應用程式的進程就是一個安全的沙箱。它不能干擾其它應用程式,除非顯式地聲明了“permissions”,以便它能夠擷取基本沙箱所不具備的額外的能力。它請求的這些許可權“permissions”可以被各種各樣的操作處理,如自動允許該許可權或者通過使用者提示或者認證來禁止該許可權。應用程式 需要的那些“permissions”是靜態在程式中聲明,所以他們會在程式安裝時被知曉,並不會再改變。

所有的Android應用程式(。apk檔案)必須用認證進行簽名認證,而這個認證的私密金鑰是由開發人員保有的。該認證可以用以識別應用程式的作者。該認證也不需要CA簽名認證(註:CA就是一個第三方的認證認證機構,如verisign等)。Android應用程式允許而且一般也都是使用self- signed認證(即自我簽署憑證)。認證是用於在應用程式之間建立信任關係,而不是用於控製程序是否可以安裝。簽名影響安全性的最重要的方式是通過決定誰可以進入基於簽名的permisssions,以及誰可以share 使用者IDs。

二. 使用者IDs和檔案存取

每一個Android應用程式(。apk檔案)都會在安裝時就分配一個專屬的Linux使用者ID,這就為它建立了一個沙箱,使其不能與其他應用程式進行接觸(也不會讓其它應用程式接觸它)。這個使用者ID會在安裝時分配給它,並在該裝置上一直保持同一個數值。
由於安全性限制措施是發生在進程級,所以兩個package中的代碼不會運行在同一個進程當中,他們要作為不同的Linux使用者出現。我們可以通過 使用AndroidManifest。xml檔案中的manifest標籤中的sharedUserId屬性,來使不同的package共用同一個使用者識別碼。通過這種方式,這兩個package就會被認為是同一個應用程式,擁有同一個使用者ID(實際不一定),並且擁有同樣的檔案存取許可權。注意:為了保持安全,只有當兩個應用程式被同一個簽名簽署的時候(並且請求了同一個sharedUserId)才會被分配同樣的使用者ID。

所有儲存在應用程式中的資料都會賦予一個屬性——該應用程式的使用者ID,這使得其他package無法訪問這些資料。當通過這些方法getSharedPreferences(String, int),openFileOutput(String, int)或者 openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory)來建立一個新檔案時,你可以通過使用MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE標誌位來設定是否允許其他package來訪問讀寫這個檔案。當設定這些標誌位時,該檔案仍然屬於該應用程式,
但是它的global read and/or write許可權已經被設定,使得它對於其他任何應用程式都是可見的。


例如:APK A 和APK B 都是C公司的產品,那麼如果使用者從APK A中登陸成功。那麼開啟APK B的時候就不用再次登陸。 具體實現就是A和B設定成同一個User ID:

packagename APK A的AndroidManifest:

<manifest xmlns:android="http://schemas。android。com/apk/res/android" package="com.Android.demo.a1" android:sharedUserId="com.c">

packagename APK A的AndroidManifest: 

<manifest xmlns:android="http://schemas。android。com/apk/res/android" package="com.Android.demo.b1" android:sharedUserId="com.c">

這個"com.c" 就是user id。 APK B就可以像開啟本機資料庫那樣開啟APK A中的資料庫了。APK A把登陸資訊存放在A的資料目錄下面。APK B每次啟動的時候讀取APK A下面的資料庫判斷是否已經登陸:

APK B中通過A的package name 就可以得到A的 packagecontext:

friendContext = this.createPackageContext( "com.android.demo.a1", Context,CONTEXT_IGNORE_SECURITY);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.