Android簽名與認證原理

一、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簽名做對比

發佈了36 篇原創文章 · 獲贊 55 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章