1. 程式人生 > >Android的許可權機制之—— “沙箱”機制sharedUserId和簽名

Android的許可權機制之—— “沙箱”機制sharedUserId和簽名

Android“沙箱”的本質是為了實現不同應用程式和程序之間的互相隔離,即在預設情況 下,應用程式沒有許可權訪問系統資源或其它應用程式的資源。每個APP和系統程序都被分配唯一併且固定的User Id,這個uid與核心層程序的uid對應。每個APP在各自獨立的Dalvik虛擬機器中執行,擁有獨立的地址空間和資源。運行於Dalvik虛擬機器中的 程序必須依託核心層Linux程序而存在,因此Android使用Dalvik虛擬機器和Linux的檔案訪問控制來實現沙箱機制,任何應用程式如果想要訪 問系統資源或者其它應用程式的資源必須在自己的manifest檔案中進行宣告許可權或者共享uid。

    安裝在裝置中的每一個apk檔案,Android給每個APK程序分配一個單獨的使用者空間,其manifest中的userid就是對應一個Linux 使用者都會被分配到一個屬於自己的統一的Linux使用者ID,並且為它建立一個沙箱,以防止影響其他應用程式(或者其他應用程式影響它)。使用者ID 在應用程式安裝到裝置中時被分配,並且在這個裝置中保持它的永久性。

通過Shared User id,擁有同一個User id的多個APK可以配置成執行在同一個程序中.所以預設就是可以互相訪問任意資料. 也可以配置成執行成不同的程序, 同時可以訪問其他APK的資料目錄下的資料庫和檔案.就像訪問本程式的資料一樣.

PID:為Process Identifier, PID就是各程序的身份標識,程式一執行系統就會自動分配給程序一個 獨一無二的PID。程序中止後PID被系統回收,可能會被繼續分配給新執行的程式,但是在android系統中一般不會把已經kill掉的程序ID重新分 配給新的程序,新產生程序的程序號,一般比產生之前所有的程序號都要大。

UID:一般理解為User Identifier,UID在linux中就是使用者的ID,表明時哪個使用者運行了這個程式,主要用於許可權的管理。而在android 中又有所不同,因為android為單使用者系統,這時UID 便被賦予了新的使命,資料共享,為了實現資料共享,android為每個應用幾乎都分配了不同的UID,不像傳統的linux,每個使用者相同就為之分配相 同的UID。(當然這也就表明了一個問題,android只能時單使用者系統,在設計之初就被他們的工程師給閹割了多使用者),使之成了資料共享的工具。

因此在android中PID,和UID都是用來識別應用程式的身份的,但UID是為了不同的程式來使用共享的資料。

在android 中要通過UID共享資料只需在程式a,b中的menifest配置即可,具體如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.perseus.a"
      android:versionCode="1"
      android:versionName="1.0"
          android:sharedUserId="com.share">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.perseus.b"
      android:versionCode="1"
      android:versionName="1.0"
          android:sharedUserId="com.share">

   這樣的話你也許會有疑問,如果讓其他的開發這知道了我們的shareUserId知道了我們的ID,那我們的資料不是暴露了,放心吧google不會犯 這樣的低階錯誤的,我們要使不同的程式能夠相互訪問,還需要擁有相同的簽名,每個公司或者開發者的簽名是唯一的,這樣我們就不用擔心了,另外兩者能夠訪 問,別忘了許可權。

總之

對於一個APK來說,如果要使用某個共享UID的話,必須做一下兩部步:

1、相同的在Manifest節點中增加android:sharedUserId屬性。

2、相同的在Android.mk中增加LOCAL_CERTIFICATE的定義。(既簽名相同)

簽名可以用eclipse或者手動或者原始碼下的mk檔案三種來簽名。

如果有看系統原始碼的同學,可以看到一些系統應用就是這樣:

系統中所有使用android.uid.system作為共享UID的APK,都會首先在manifest節點中增加 android:sharedUserId="android.uid.system",然後在Android.mk中增加 LOCAL_CERTIFICATE := platform。可以參見Settings等

系統中所有使用android.uid.shared作為共享UID的APK,都會在manifest節點中增加 android:sharedUserId="android.uid.shared",然後在Android.mk中增加 LOCAL_CERTIFICATE := shared。可以參見Launcher等

系統中所有使用android.media作為共享UID的APK,都會在manifest節點中增加 android:sharedUserId="android.media",然後在Android.mk中增加LOCAL_CERTIFICATE := media。可以參見Gallery等。

另外,應用建立的任何檔案都會被賦予應用的使用者標識,並且正常情況下不能被其他包訪問。當通過 getSharedPreferences(String,int)、openFileOutput(String、int)或者 openOrCreate Database(String、int、SQLiteDatabase.CursorFactory)建立一個新檔案時,開發者可以同時或分別使用 MODE_WORLD_READABLE和MODE_WORLD_RITEABLE標誌允許其他包讀/寫此檔案。當設定了這些標誌後,這個檔案仍然屬於自 己的應用程式,但是它的全域性讀/寫和讀/寫許可權已經設定,所以其他任何應用程式可以看到它。這個和上面的設定sharedUId想必更加不安全。

關於簽名:

build/target/product/security目錄中有四組預設簽名供Android.mk在編譯APK使用:

1、testkey:普通APK,預設情況下使用。

2、platform:該APK完成一些系統的核心功能。經過對系統中存在的資料夾的訪問測試,這種方式編譯出來的APK所在程序的UID為system。

3、shared:該APK需要和home/contacts程序共享資料。

4、media:該APK是media/download系統中的一環。

簽名部分:

應用程式的Android.mk中有一個LOCAL_CERTIFICATE欄位,由它指定用哪個key簽名,未指定的預設用testkey.

對於使用eclipse編譯的apk,可以使用signapk.jar來手動進行簽名,其原始碼在build/tools/signapk下,編譯後 在out/host/linux-x86/framework/signapk.jar,也可以從網上下載。使用方法,以platform為例:java -jar ./signapk platform.x509.pem platform.pk8 input.apk output.apk  (platform.x509.pem platform.pk8在build/target/product/security獲取)

相關推薦

Android許可權機制—— “沙箱機制sharedUserId簽名

Android“沙箱”的本質是為了實現不同應用程式和程序之間的互相隔離,即在預設情況 下,應用程式沒有許可權訪問系統資源或其它應用程式的資源。每個APP和系統程序都被分配唯一併且固定的User Id,這個uid與核心層程序的uid對應。每個APP在各自獨立的Dalvi

我所理解的Android元件化通訊機制

之前寫過一篇關於Android元件化的文章,《Android元件化框架設計與實踐》,之前沒看過的小夥伴可以先點選閱讀。那篇文章是從實戰中進行總結得來,是公司的一個真實專案進行元件化架構改造,粒度會分的更粗些,是對整體架構實踐進行相應的總結,裡面說了要打造一個元件化框架的話,需要從以下7個方面入手: 程式碼解

Android面試系列Handler機制

1.什麼是Handler?   Handler是可以通過傳送和處理Message和Runnable物件來關聯相應執行緒的MessageQueue。通常我們認為它是一種非同步機制。   a.可以讓對應的Message和Runnable在未來的某個時間點進行相應的處理。   

Android IPC通訊Binder機制分析

優勢: 與Linux中的Pipe管道、訊號Signal、訊息佇列Message、共享記憶體Share Memory、Socket插口等相比較,Binder在程序間傳輸資料,只需要執行一次拷貝操作。因此它不僅提高了效率,而且節省了記憶體空間。 角色: Ser

Android面試篇IPC機制[程序之間的通訊]

簡介 IPC Inter-Process Communication 跨程序通訊,兩個程序之間進行資料交換的過程 在Android中的多程序一般指一個應用中存在多個程序的情況,下面討論一個應用中多程序

Android原始碼分析訊息機制——Handler原始碼解析

 Android的訊息機制主要是指Handler的執行機制,Handler是Android訊息機制上層介面的實現,它的執行需要Message、MessageQueue和Looper的支撐,下面就來分別介紹它們的實現原理。 1、Message原始碼解析  首先來了解一下Messag

JAVA多執行緒機制暫停、恢復停止

在JDK1.2以前的版本如果要實現執行緒的暫停、恢復和停止的方法分別是suspend()、resume()、stop()。但是從JDK1.2以後這些方法已經被遺棄,因為它們有可能造成嚴重的系統錯誤和異常。 首先suspend()方法不會釋放執行緒所佔用的資源。

Windows訊息響應機制四:PostQuitMessageGetMessage函式

 Windows是訊息驅動的作業系統。在Windows環境下程式設計必須熟練掌握Windows訊息響應機制。  今天在練習Win32程式設計時碰到一個關於GetMessage函式的問題。這個問題之前一直沒有引起過我的注意,但是今天  在網上搜索發現這個問題很多程式設計師都跟

Internet流量監管機制漏桶演算法令牌桶演算法

        漏桶演算法和令牌桶演算法都是為了限制應用無限制的向網路注入流量而設定的演算法。兩者看似區別不大,但是如果仔細來看,是有區別的:漏桶演算法只能把應用的輸出速率限定在一個固定的速度,但是令牌桶除了在把總的輸出速率限制在一定範圍內,還能容忍一定時間的高速率突發流量

Angular $scope$rootScope事件機制$emit、$broadcast$on

歡迎大家到我的部落格檢視本文對應內容,關注和交流對於Angular和Ionic學習的理解。 Angular按照釋出/訂閱模式設計了其事件系統,使用時需要“釋出”事件,並在適當的位置“訂閱”或“退訂”事件,就像郵箱裡面大量的訂閱郵件一樣,當我們不需要時就

Android 安全機制2 沙箱機制

Android 系統沿用了Linux系統的UID/GID(使用者組ID)的許可權模型,但是並沒有使用Linux傳統的passwd和group檔案來儲存使用者與使用者組的 憑證資訊,作為替代,Android定義了從名稱到獨特識別符號的Android ID(AID)對映表。初始的對映表中定義了一些特權使用者和一些

Android 外掛化Hook機制

Android Hook簡介 什麼是Hook Hook 英文翻譯過來就是「鉤子」的意思,就是在程式執行的過程中去擷取其中的資訊。Android 作業系統中系統維護著自己的一套事件分發機制,那麼Hook就是在事件傳送到終點前截獲並監控事件的傳輸。其原理示意圖如

linux同步機制訊號量down up

訊號量(semaphore)   Linux核心的訊號量在概念和原理上和使用者態的System V的IPC機制訊號量是相同的,不過他絕不可能在核心之外使用,因此他和System V的IPC機制訊號量毫不相干。   訊號量在建立時需要設定一個初始值,表示同時能有幾個任務能訪問

Android全面解析Context機制

## 前言 很高興遇見你~ 歡迎閱讀我的文章。 在文章[Android全面解析之由淺及深Handler訊息機制](https://blog.csdn.net/weixin_43766753/article/details/108968666)中討論到,Handler可以: > 避免我們自己去手動寫 死迴

MQ確認機制事務機制----confirm串行

技術 全部 main 就會 多條 技術分享 接受 send wait 一:介紹 1.說明原理   A:生產者將信道設置成confirm模式,一旦信道進到confirm模式,所有該信道上發布的消息都會被指派一個唯一的ID(從1開始)。   一旦消息被投遞到所有匹配的隊列後,b

Android原始碼分析為什麼在onCreate() onResume() 獲取不到 View 的寬高

轉載自:https://www.jianshu.com/p/d7ab114ac1f7 先來看一段很熟悉的程式碼,可能在最開始接觸安卓的時候,大部分人都寫過的一段程式碼;即嘗試在 onCreate() 和 onResume() 方法中去獲取某個 View 的寬高資訊: 但是列印輸出後,我們會發

Android開發的基本控制元件詳解四種佈局方式

Android中的控制元件的使用方式和iOS中控制元件的使用方式基本相同,都是事件驅動。給控制元件新增事件也有介面回撥和委託代理的方式。今天這篇部落格就總結一下Android中常用的基本控制元件以及佈局方式。說到佈局方式Android和iOS還是區別挺大的,在iOS中有Frame絕對佈局和AutoL

Android深入學習requestLayout、invalidatepostInvalidate的區別

         Android開發離不開介面的重繪和更新,尤其是自定義控制元件更是經常遇到重繪更新介面的場景,下面具體介紹一下重繪介面幾個方法的區別:         (1)、requestLayout:

[Android] Android開發優化——使用軟引用弱引用

Java從JDK1.2版本開始,就把物件的引用分為四種級別,從而使程式能更加靈活的控制物件的生命週期。這四種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。這裡重點介紹一下軟引用和弱引用。如果一個物件只具有軟引用,那麼如果記憶體空間足夠,垃圾回收器就不會回收它;如果記憶體

Android 網路程式設計同步,非同步,阻塞非阻塞

同步:函式沒有執行完不返回,執行緒被掛起;   阻塞:沒有收完資料函式不返回,執行緒也被掛起;  非同步:函式立即返回,通過事件或是訊號通知呼叫者;  非阻塞:函式立即返回,通過select通知呼叫者  同步:函式沒有執行完不返回,執行緒被掛起 阻塞:沒有收完資料函式不返回,執行緒也被掛起 非同步:函