android 自定義permission

 在android系統的安全模型中,應用程序在默認的狀況下不能夠執行任何對其餘應用程序,系統或者用戶帶來負面影響的操做。若是應用須要執行某些操做,就須要聲明使用這個操做對應的權限。 (在manifest文件中 添加<uses-permission>標記)

   android 系統提供了一系列這樣的權限,具體能夠查看 android 權限,另外,android系統在新的版本中會增長一些permission,能夠查看 android 版本信息

   固然,app也能夠自定義屬於本身的permission 或屬於開發者使用的同一個簽名的permission。定義一個permission 就是在menifest文件中添加一個permission標籤。
Xml代碼
  1. <permission android:description="string resource" 
  2.             android:icon="drawable resource" 
  3.             android:label="string resource" 
  4.             android:name="string" 
  5.             android:permissionGroup="string" 
  6.             android:protectionLevel=["normal" | "dangerous" |  
  7.                                      "signature" | "signatureOrSystem"] /> 

<permission android:description="string resource"
            android:icon="drawable resource"
            android:label="string resource"
            android:name="string"
            android:permissionGroup="string"
            android:protectionLevel=["normal" | "dangerous" | 
                                     "signature" | "signatureOrSystem"] />



android:description :對權限的描述,通常是兩句話,第一句話描述這個權限所針對的操做,第二句話告訴用戶授予app這個權限會帶來的後果
android:label: 對權限的一個簡短描述
android:name :權限的惟一標識,通常都是使用 報名加權限名
android:permissionGroup: 權限所屬權限組的名稱
android:protectionLevel: 權限的等級,
normal 是最低的等級,聲明次權限的app,系統會默認授予次權限,不會提示用戶
dangerous  權限對應的操做有安全風險,系統在安裝聲明此類權限的app時會提示用戶
signature  權限代表的操做只針對使用同一個證書籤名的app開放
signatureOrSystem  與signature相似,只是增長了rom中自帶的app的聲明

android:name 屬性是必須的,其餘的可選,未寫的系統會指定默認值

下面經過指定一個BroadcastReceiver的權限來實驗
首先建立了兩個app,app A ,app B ;
app A中註冊了一個BroadcastReceiver ,app B 發送消息
app A的menifest文件:
Xml代碼
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     package="com.example.testbutton" 
  3.     android:versionCode="1" 
  4.     android:versionName="1.0" > 
  5.  
  6.     <uses-sdk 
  7.         android:minSdkVersion="7" 
  8.         android:targetSdkVersion="15" /> 
  9.     <!-- 聲明權限 --> 
  10.     <permission android:name="com.example.testbutton.RECEIVE" /> 
  11.  
  12.     <application 
  13.         android:icon="@drawable/ic_launcher" 
  14.         android:label="@string/app_name" 
  15.         android:theme="@style/AppTheme" > 
  16.         <activity 
  17.             android:name=".MainActivity" 
  18.             launcheMode="singleTask" 
  19.             android:configChanges="locale|orientation|keyboardHidden" 
  20.             android:screenOrientation="portrait" 
  21.             android:theme="@style/android:style/Theme.NoTitleBar.Fullscreen" > 
  22.             <intent-filter> 
  23.                 <action android:name="android.intent.action.MAIN" /> 
  24.  
  25.                 <category android:name="android.intent.category.LAUNCHER" /> 
  26.             </intent-filter> 
  27.         </activity> 
  28.         <!-- 註冊Broadcast Receiver,並指定了給當前Receiver發送消息方須要的權限 --> 
  29.         <receiver 
  30.             android:name="com.example.testbutton.TestButtonReceiver" 
  31.             android:permission="com.example.testbutton.RECEIVE" > 
  32.             <intent-filter> 
  33.                 <action android:name="com.test.action" /> 
  34.             </intent-filter> 
  35.         </receiver> 
  36.     </application> 
  37.  
  38. </manifest> 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testbutton"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="15" />
    <!-- 聲明權限 -->
    <permission android:name="com.example.testbutton.RECEIVE" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            launcheMode="singleTask"
            android:configChanges="locale|orientation|keyboardHidden"
            android:screenOrientation="portrait"
            android:theme="@style/android:style/Theme.NoTitleBar.Fullscreen" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- 註冊Broadcast Receiver,並指定了給當前Receiver發送消息方須要的權限 -->
        <receiver
            android:name="com.example.testbutton.TestButtonReceiver"
            android:permission="com.example.testbutton.RECEIVE" >
            <intent-filter>
                <action android:name="com.test.action" />
            </intent-filter>
        </receiver>
    </application>

</manifest>



app B 的menifest 文件內容
Xml代碼
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     package="com.example.testsender" 
  3.     android:versionCode="1" 
  4.     android:versionName="1.0" > 
  5.  
  6.     <uses-sdk 
  7.         android:minSdkVersion="7" 
  8.         android:targetSdkVersion="15" /> 
  9.     <!-- 聲明使用指定的權限 --> 
  10.     <uses-permission android:name="com.example.testbutton.RECEIVE" /> 
  11.  
  12.     <application 
  13.         android:icon="@drawable/ic_launcher" 
  14.         android:label="@string/app_name" 
  15.         android:theme="@style/AppTheme" > 
  16.         <activity 
  17.             android:name=".MainActivity" 
  18.             android:label="@string/title_activity_main" > 
  19.             <intent-filter> 
  20.                 <action android:name="android.intent.action.MAIN" /> 
  21.  
  22.                 <category android:name="android.intent.category.LAUNCHER" /> 
  23.             </intent-filter> 
  24.         </activity> 
  25.     </application> 
  26.  
  27. </manifest> 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testsender"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="15" />
    <!-- 聲明使用指定的權限 -->
    <uses-permission android:name="com.example.testbutton.RECEIVE" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>




這樣app B 給app A 發送消息,A就能夠收到了,若未在app B的menifest文件中聲明使用相應的權限,app B發送的消息,A是收不到的。

另外,也可在app B 的menifest文件中聲明權限時,添加android:protectionLevel=「signature」,指定app B只能接收到使用同一證書籤名的app 發送的消息。 html

 

 


  因爲Android部分設計原理較爲開放,可能經過Intent或PackageManager就能夠解析處理調用其餘應用的子類,因此在部分應用中須要作更多的安全處理,保證應用內部的穩定性和安全性。 android

       穩定性: 部分類可能沒有數值的傳入將會致使可能初始化失敗,形成Force Close等問題。 數據庫

        安全性: 其餘應用調用本程序的SQL數據庫等問題,可能會形成一些沒法預料到的損失。 安全

  1、Android應用內部安全保護  多線程

        爲了考慮內部部分敏感數據處理的安全性加入類ACL訪問控制,固然使用了更加靈活的,好比UID、SID、PID等多種方式。 app

       1. 部分私有的配置信息,或相對輕量級的內容,可使用SharedPreferences接口提供的相關方法處理,並設置爲安全標誌位私有MODE_PRIVATE,不過須要注意的是該方法僅能本進程調用。 ide

       2. SQLite的安全問題,對於Content Provider的處理權限,在Android中能夠直接顯示的聲明,好比在androidmanifest.xml中聲明讀或寫權限,在Provider節點中,聲明android:writePermission或android:readPermission屬性,固然其餘程序聲明瞭這些權限也能夠訪問,這時咱們能夠經過 android:authorities屬性限制一個類的訪問,好比android:authorities="cn.com.android.cwj" 。最終相似 ui

     <provider
       android:name="cwjProvider"
       android:authorities="cn.com.android.cwj"
       android:writePermission="cn.com.android.cwj.permission.WRITE_DATABASE"
       android:readPermission="cn.com.android.cwj.permission.READ_DATABASE" /> spa

       數據庫自己的讀寫能夠處理多線程問題,可是數據的前後能夠考慮同步問題,設置android:multiprocess="true"屬性來保證數據的正確性,相關問題不在本文討論範圍內,咱們可能會在之後的內容中涉及這部分問題。 線程

     3.  Activity、Service和Receiver的權限聲明方式,能夠直接使用android:permission屬性,具體的和上面的SQLite安全同樣的處理方式,演示代碼以下

     <activity
        android:name=".cwj"
        android:authorities="cn.com.android"
        android:permission="cn.com.android.cwj.permission.ACCESS"/>

  2、Permission的聲明

  <permission
        android:name="cn.com.android.cwj.permission.ACCESS"
        android:protectionLevel="normal"
        android:label="@string/permission_aceess"
        android:description="@string/permission_aceess_detail" />

       固然還有可選的屬性好比說android:protectionLevel="normal"設置保護權限,還有必須簽名signature,固然這裏對於權限分組咱們能夠經過相似permission的方法來聲明permissionGroup,或直接使用系統的,好比android:permissionGroup="android.permission-group.SYSTEM_TOOLS"最終其餘應用中調用,能夠顯示的在本身的manifest.xml中聲明便可,相似 <uses-permission android:name="cn.com.android.cwj.permission.ACCESS" />

3、帳戶安全聲明

       直接在androidmanifest.xml中的Application中直接聲明,好比標準用戶權限相似

       android:sharedUserId="android.uid.shared"  ,固然處理一些RIL方面的能夠聲明相似 android.uid.phone 的權限,處理一些更敏感的數據。

4、Service安全

        對於Service而言除了限制訪問的package外,咱們還能夠經過直接綁定並參數判斷的訪問來處理儘可能不使用android:exported="true"的導出方法,固然經過broadcast方式通信能夠經過intent的extra方式能夠作一些簡單的驗證。

5、PID的安全問題

       PID的安全問題,經過限制processID的方式限制訪問,僅容許在同一個進程空間訪問。

6、android permissionLevel

       在permissionLevel的定義時設置了android:protectionLevel這一項。取值範圍有四種:        "normal"        "dangerous"       "signature"        "signatureOrSystem"        若是定義的是前面兩種normal或者dangerous, 咱們本身的應用須要去訪問其對應受保護的資源時只須要在androidManifest.xml中添加相同的uses-permission就好了。 若是是signature, 咱們僅僅添加對權限的使用還不行, 必須同時具備相同的簽名。 若是是signatureOrSystem, 不只要有相同的簽名, 還必須有相同的sharedUserId. 

相關文章
相關標籤/搜索