1. 程式人生 > >Android簽名與認證META-INFO目錄下檔案

Android簽名與認證META-INFO目錄下檔案

一、Android簽名概述

我們已經知道的是:Android對每一個Apk檔案都會進行簽名,在Apk檔案安裝時,系統會對其簽名信息進行比對,判斷程式的完整性,從而決定該Apk檔案是否可以安裝,在一定程度上達到安全的目的。

給定一個Apk檔案,解壓,可以看到一個META-INFO資料夾,在該資料夾下有三個檔案:分別為MANIFEST.MFCERT.SFCERT.RSA。這三個檔案分別表徵以下含義:

(1)MANIFEST.MF:這是摘要檔案。程式遍歷Apk包中的所有檔案(entry),對非資料夾非簽名檔案的檔案,逐個用SHA1生成摘要資訊,再用Base64進行編碼。如果你改變了apk包中的檔案,那麼在apk安裝校驗時,改變後的檔案摘要資訊與MANIFEST.MF的檢驗資訊不同,於是程式就不能成功安裝。

說明:如果攻擊者修改了程式的內容,有重新生成了新的摘要,那麼就可以通過驗證,所以這是一個非常簡單的驗證。

(2)CERT.SF:這是對摘要的簽名檔案。對前一步生成的MANIFEST.MF,使用SHA1-RSA演算法,用開發者的私鑰進行簽名。在安裝時只能使用公鑰才能解密它。解密之後,將它與未加密的摘要資訊(即,MANIFEST.MF檔案)進行對比,如果相符,則表明內容沒有被異常修改。

說明:在這一步,即使開發者修改了程式內容,並生成了新的摘要檔案,但是攻擊者沒有開發者的私鑰,所以不能生成正確的簽名檔案(CERT.SF)。系統在對程式進行驗證的時候,用開發者公鑰對不正確的簽名檔案進行解密,得到的結果和摘要檔案(MANIFEST.MF

)對應不起來,所以不能通過檢驗,不能成功安裝檔案。

(3)CERT.RSA檔案中儲存了公鑰、所採用的加密演算法等資訊。

說明:系統對簽名檔案進行解密,所需要的公鑰就是從這個檔案裡取出來的。

結論:從上面的總結可以看出,META-INFO裡面的說那個檔案環環相扣,從而保證Android程式的安全性。(只是防止開發者的程式不被攻擊者修改,如果開發者的公私鑰對對攻擊者得到或者開發者開發出攻擊程式,Android系統都無法檢測出來。)

參考文章:http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html

二、在Eclipse下配置App的簽名信息

對App進行簽名的方式一般有以下幾種:通過Google提供的簽名工具,通過某些開發者開發的簽名工具或者通過Eclipse提供的簽名方法,但一般而言,他們都是在下層呼叫Google提供的簽名工具,所以簽名的方法都相同。

例如,在Eclipse下面配置簽名信息時,可以設定開發者資訊:


具體參考文章:http://blog.csdn.net/zuolongsnail/article/details/6444197(上圖來源於該文章)

說明:從上圖可以看出,在Eclipse中,可以設定開發者的詳細資訊。在其他的簽名工具中,可能會直接呼叫其他簽名信息。

值得注意的是,在設定簽名信息的時候,會有如下圖所示的步驟:


請暫且記住這裡有認證指紋資訊:MD5和SHA1。由於這一步驟是在編譯生成Apk檔案之前進行的,所以,說明這裡的MD5和SHA1與程式的內容毫無關係,只與開發者的公私鑰對等開發資訊有關。

我們自己設定簽名信息之後開發程式並簽名,得到的簽名信息經過keytool.exe解析結果如下:


說明:由上圖可以發現,解析結果中的MD5和SHA1與上面得到的MD5,SHA1是相同的。

三、同一個公司的不同App的簽名有關係嗎?

我們有一個疑問,許多網際網路大公司會開發許多官方的移動應用,那麼這些應用的簽名信息是否相同呢,他們所用的公私鑰對是否都是一樣的?我們對Tencent公司的QQ,QQ空間,微信三款產品進行解析,得到下面的結果和結論。

1、使用keytool.exe

使用Java提供的keytool.exe工具對三款產品的簽名情況(CERT.RSA檔案)進行解析,情況如下所示。

微信:


QQ:


QQ空間:


說明:從上面的三幅圖可以看出,雖然同為Tencent的三款產品,但是他們的所有者資訊、簽發人資訊等都不盡相同,儘管他們都表示了騰訊公司或者Tencent等資訊。因為這是開發者自己設定的,而且微信和QQ屬於不同的事業部,辦公地點不同,所以他們的簽名信息不同也就不足為奇了。

2、自己寫應用提取

自己寫程式從CERT.RSA提取出公鑰資訊和證書中的簽名信息(對開發者資訊的簽名,例如姓名,公司,國家等。。。),情況如下:

由於都是一些字元,且很多,所以只取開始和結束的幾位位元做一說明:

微信:

公鑰:c05f........5e9f

簽名:3082....1949

QQ:

公鑰:a15e........3695

簽名:3082........2049

QQ空間:

公鑰:82d...........445

簽名:3082........1677

說明:由於三款App的開發者設定的簽名信息幾乎不同,使用的公私鑰對都不同,所以這裡取出來的公鑰和簽名信息幾乎不同。唯一相同的是三款App的簽名的開始一些位元,可能是因為有的資訊相同,具體不得而知。

四、同一款App的不同版本簽名信息有關係嗎?

為了說明這個問題,我們對QQ的兩個版本做了檢測,情況如下:

QQ4.7.0:

公鑰:a15e........3695

簽名:3082........2049

QQ4.6.2:

公鑰:a15e........3695

簽名:3082........2049

說明:QQ的兩個不同版本,從CERT.RSA檔案中取出的公鑰和簽名信息,完全相同。說明QQ開發團隊始終使用的是一個相同的公私鑰對。當然,他們對於不同的版本使用不同的公私鑰對也是可以的,也是可能的。這種可能性發生在他們主動更改公私鑰對的情況下,也可能發生在他們用不同的環境進行簽名的情況下。

五、可以修改META-INFO資料夾下的檔案嗎?

(1)CERT.RSA,CERT.SF的檔名可以修改。

我們把CERT.SF的檔名改成CERT1.SF,把CERT.RSA的檔名改成CERT1.RSA,原來的Apk檔案可以被成功安裝。

說明:Android系統在檢測的時候,不會一定要找到CERT這種檔名,是按照檔案型別來檢測的。但是,如果.RSA檔案與.SF檔案的名字不同,那麼就不能成功安裝。

(2)新增自己的CERT.SF和CERT.RSA檔案到META-INFO資料夾下面,不能成功。

說明:在(1)的基礎上,我們執行(2)操作,不能成功安裝,這是因為Android系統找不到摘要檔案與(2)中新增上的兩個檔案進行對應。

六、不同的簽名應用,得到的結果可能不同。

用Eclipse簽名的Apk檔案,解析CERT.RSA檔案之後得到的結果如下:


用Dodo Apktools簽名後的Apk檔案解析之後結果如下:


說明:用Dodo簽名的解析檔案多了後面的擴充套件部分,但總體內容不變。

七、應用商店用什麼方式檢測官方版?

豌豆莢推出的洗白白功能很受歡迎,那麼他們是如何辨別App的是否是官方出品的呢?

根據蒐集到的資料,他們CEO說是這樣實現的:將商店裡的App與官網上的App簽名做對比

搜尋結果王俊煜的描述,他們是通過將開發者上傳的應用與官網上的應用的簽名對比是否相同來確定App是否是官方出品的。從上面的分析,我們也可以得出結論,應用商店採用這種方法是最合適的。

相關推薦

Android簽名認證META-INFO目錄檔案

一、Android簽名概述 我們已經知道的是:Android對每一個Apk檔案都會進行簽名,在Apk檔案安裝時,系統會對其簽名信息進行比對,判斷程式的完整性,從而決定該Apk檔案是否可以安裝,在一定程度上達到安全的目的。 給定一個Apk檔案,解壓,可以看到一個META

Android簽名認證詳細分析之一(CERT.RSA剖析)

一、Android簽名概述 我們已經知道的是:Android對每一個Apk檔案都會進行簽名,在Apk檔案安裝時,系統會對其簽名信息進行比對,判斷程式的完整性,從而決定該Apk檔案是否可以安裝,在一定程度上達到安全的目的。 給定一個Apk檔案,解壓,可以看到一個META

Android之動態修改system/etc目錄檔案的一種實現方式-SELinux

在沒有root的前提下,system分割槽為只讀,若要動態修改該分割槽下的檔案,可以按照下面流程實現: 1.寫執行指令碼,這裡以修改system/etc/hosts檔案為例,在/device/mediatek/mt67xx目錄下建立名為modifyhosts.sh的檔案,檔

Android jar包裡面有assets目錄檔案,APP的assets裡面也有檔案,如何讀呢?

jar 包中可以寫 assets資料夾, APP裡面同時也可以寫assets,但是隻要assets下面的檔案不同名就可以了,忒棒 !!! 如果assets目錄下有檔案的,

使用adb命令刪除Android系統data目錄檔案及資料夾

使用命令刪除data目錄下的資料夾,和刪除一般檔案不同。 data目錄下的檔案需要777許可權,所以需要的命令不同 data目錄: C:\Users\aw>adb shell roo

Android簽名許可權的安全問題(3)

簽名和許可權的作用 Android簽名中使用到的一些加密技術有: 公/私鑰, SHA1(CERT.SF,MANIFEST.MF), RSA(CERT.RSA), 訊息摘要, 移動平臺中的主流簽名作用: Android平臺中是使用自簽名 自簽名,證書的簽名者和證書擁有者是同一人. 自簽名

Android 拷貝Asset目錄檔案或者資料夾

專案中需要拷貝Asset目錄下的所有檔案,因為Asset目錄是隻讀的,操作起來不是很方便,上網搜了一些方法並不是很有效,記錄一下最後的解決方案: //path - asset下檔案(夾)名稱 destinationPath - 目的路徑 `private

Android Studio中讀取Assets目錄檔案

參考網址 首先,android studio 下的assets目錄檔案跟在eclipse下不一樣,所以有時候讀取assets目錄下的的檔案會無法讀取。 Android Studio中,這個assets目錄必須放在跟res同級目錄,也就是在main資料夾裡面,如下面2

Linux如何檢視/dev/input/event目錄對應的裝置

1. /dev/input目錄     /dev/input目錄下的事件都是在驅動中呼叫input_register_device(struct input_dev *dev)產生的。如我的盒子的/dev/input目錄的內容如下: crw-rw---- root

Android手動清除APP中Data目錄檔案

在專案中這樣的需求,在使用者觸發重置的時候需要清除自身APP中的資料,APP自身的資料儲存在/data/data/packagename/目錄下,如下圖: lib目錄下儲存so庫檔案,不能清除,需清除其他目錄下的檔案;  Java程式碼       /**      

獲取assets目錄檔案的路徑

關於這個問題網上很多回答都是轉自下面的內容 第二種方法看程式碼就知道不靠譜,第一種方法感覺在後面就是不適用了。 下面是我自己做的路徑獲取程式碼: File image = getFileStreamPath("image.jpg"); File second

Android使用chmod改變安卓專案檔案讀寫執行的許可權

最初我們可以看到private.txt檔案 當前使用者具有可讀可寫許可權,當前使用者所在組具有可讀可寫許可權,其他使用者沒有任何許可權,下面我們就要利用chmod指令對private.txt許可權進行修改。 首先用開始按鈕+R開啟執行,輸入cmd進入終端頁面,輸入adb shell回車,然

java 正則匹配 HDFS路徑後獲取目錄檔案

public static void main(String[] args) { URI uri = URI.create("hdfs://cdh-master:8020"); FileSystem hdfs = null; Path path = n

Linux檢視當前目錄檔案/目錄數量

1) 統計當前資料夾下檔案的個數: ls -l |grep "^-"|wc -l   2) 統計當前資料夾下目錄的個數: ls -l |grep "^d"|wc -l   3) 統計當前資料夾下檔案的個數,包括子資料夾裡的 : ls -lR|grep

FatFs-目錄檔案掃描

FatFs - 通用的FAT檔案系統模組 FatFs是用於小型嵌入式系統的通用FAT/exFAT檔案系統模組。FatFs模組是按照ANSI C (C89)編寫的,完全獨立於磁碟I/O層。因此它是獨立於平臺的。在資源有限的情況下,可以整合到小型微控制器中,如8051、PIC、AVR、ARM、Z80

目錄分離問題——同一目錄檔案過多

同一目錄下檔案過多 (1) 按照上傳時間進行目錄分離(年、月、日) (2) 按照上傳使用者進行目錄分離 (3) 按照唯一檔名的hashcode進行目錄分離 目錄分離演算法—hacode int hashCode = fileName.hashCode()

zabbix自定義指令碼監測windows伺服器指定目錄檔案數量,並設定告警及圖形

一、新增自定義監控引數 1、在agent端修改配置檔案允許自定義監控引數 UnsafeUserParameters=1 2、新增自定義監控引數 UserParameter=count.files,dir "f:/test/"|find /C ".Z" 相關DOS命令介紹

專案獲取srcresource目錄檔案

有兩種方式: Java程式碼中的類,要獲取Resource資原始檔目錄下檔案 A:  絕對路徑定址:String s1 = this.getClass().getResource("/test.pxml").getPath();   !!!!!!!!!!!!!!!!!

shell指令碼 統計目錄檔案數量

1、 統計當前資料夾下檔案的個數   ls -l |grep "^-"|wc -l 2、 統計當前資料夾下目錄的個數   ls -l |grep "^d"|wc -l 3、統計當前資料夾下檔案的個數,包括子資料夾裡的    ls -lR|grep "^-"|wc -

Eclipse中.setting目錄檔案介紹

Eclipse專案中系統檔案介紹 一. 寫在前面 文章較長,可以直接到感興趣的段落,或者直接關鍵字搜尋; 請原諒作者掌握的程式語言少,這裡只研究Java相關的專案; 每一個檔案僅僅做一個常見內容的簡單介紹,這些知識多數來自於實踐理解和網路搜尋,可能會不全面,更詳細的可以看