android利用數字證書對程序簽名

http://blog.csdn.net/qianfu111/article/details/9113887

 

簽名的必要性

1、  防止你已安裝的應用被惡意的第三方覆蓋或替換掉

2、  開發者的身份標識,簽名可以防止抵賴等事件的發生。

        開發Android的人這麼多,完全有可能大家都把類名,包名起成了一個同樣的名字,這時候如何區分?簽名這時候就是起區分作用的。另外由於開發商可能通過使用相同的Package Name來混淆替換已經安裝的程序,簽名這時可以可以防止你已安裝的應用被惡意的第三方覆蓋或替換掉。因而APK如果使用一個key簽名,發佈時另一個key簽名的文件將無法安裝或覆蓋老的版本。


簽名方式

簽名有很多種方式,常見的有:

1、  在Eclipse下通過插件獲取數字證書,並簽名你的應用。

        打開Eclipse->選擇你要簽名的項目->右擊->android tools->Export signedApplication package,再進行相關操作。這裏首先需要創建數字證書,然後再利用數字證書籤名你的應用。

      運氣好時,你會發現簽名失敗,卻怎麼也找不到原因。本人之前就遇到過這種情況,也困惑過好久,最終才發現是插件出問題了,抓狂。那你不妨使用下面一種方法。

2、  用KeyTool產生數字證書文件,再簽名你的應用。

命令:

[plain] view plaincopy
  1. keytool -genkey -v -keystore D:\Users\Administrator\Desktop\mytest.keystore-alias mytest -keyalg RSA -validity 20000  

其中參數含義如下:

[plain] view plaincopy
  1. -keystore D:\Users\Administrator\Desktop\mytest.keystore表示生成的證書及其存放路徑,默認在用戶主目錄下;  
  2. -alias mytest 表示證書的別名是mytest;  
  3. -keyalg RSA 表示採用的RSA算法;  
  4. -validity 20000表示證書的有效期是20000天。  


這樣你就會在相應目錄下獲得所需的數字證書,如上圖所示。

獲取到數字證書之後,你就可以用數字證書去簽名你的應用,簽名步驟如下:

右擊工程 --> 選擇Android Tools --> Export Signed Application Package --> 選擇next  --> 選擇Use existing keystore,並填寫數字證書位置,以及密碼,再next --> using existing key,選擇alias,以及密碼,再next --> 選擇程序存放位置後完成。


補充:


有時你可能還需要得到證書指紋(MD5和SHA1)。

1、獲取證書指紋(MD5)命令:

 

[plain] view plaincopy
  1. keytool -list -alias mytest -keystore D:\Users\Administrator\Desktop\mytest.keystore  

2、獲取證書指紋(SHA1)命令:

[plain] view plaincopy
  1. keytool -v -alias mytest -keystore  D:\Users\Administrator\Desktop\mytest.keystore  

3、這兩條命令只是參數不同,你也可以同時獲取證書指紋(MD5和SHA1),當然-alias後面的別名一定要跟前面的對應。命令如下圖所示:



數字證書簡介:


Android數字證書包含以下幾個要點: 


        在Android系統中,所有安裝到系統的應用程序都必有一個數字證書,此數字證書用於標識應用程序的作者和在應用程序之間建立信任關係,不是用來決定最終用戶可以安裝哪些應用程序,數字證書的私鑰則保存在程序開發者的手中。這個數字證書並不需要權威的數字證書籤名機構認證,它只是用來讓應用程序包自我認證的。如果一個permission的protectionLevel爲signature,那麼就只有那些跟permission所在的程序擁有同一個數字證書的應用程序才能取得該權限。

         Android使用Java的數字證書相關的機制來給apk加蓋數字證書,要理解android的數字證書,需要先了解以下數字證書的概念和java的數字證書機制。Android系統要求每一個安裝進系 統的應用程序都是經過數字證書籤名的, Android將數字證書用來標識應用程序的作者和在應用程序之間建立信任關係。
(1)所有的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序。
(2)Android程序包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證。

(3)如果要正式發佈一個Android,必須使用一個合適的私鑰生成的數字證書來給程序簽名 ,而不能使用adt插件或者ant工具生成的調試證書來發布。

        Android的開發工具(ADT插件和Ant)都可以協助開發者給apk程序簽名,它們都有兩種模式:調試模式(debug mode)發佈模式(release mode)。在調試模式下,android的開發工具會在每次編譯時使用調試用的數字證書(default.keystore)給程序簽名,開發者無須關心。當要發佈程序時,開發者就需要使用自己的數字證書給apk包簽名。因此,當我們在開發微信分享功能時候,需要使用發佈模式。如果不使用自己生成的數字證書,你將只能在第一次分享成功,以後就一直調不出分享的界面。

(4)數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。如果程序已經安裝在系統中,即使證書過期也不會影響程序的正常功能。Android Market強制要求所有應用程序數字證書的有效期要持續到2033年10月22日以後。
(5)Android使用標準的java工具Keytool和Jarsigner來生成數字證書,並給應用程序包簽名。

(6)使用zipalign優化程序。

有關簽名密鑰(證書)與發行包名變化可能有如下限定:


       下面是我自己測試的結果,跟網上的一些資料有些出入,個人認爲包主要判斷是否屬於同一應用,然後簽名用來判斷程序所屬者,判斷是否屬於不同版本。有任何問題,歡迎輕拍。

1、包名相同,簽名相同:安裝時可覆蓋安裝(就是同一程序同一版本)。

2、包名相同,簽名不同:Android認爲版本發生了變化,需先卸載再安裝(同一程序不同版本)。

3、包名不同,簽名相同:正常安裝。

4、包名不同,簽名不同:正常安裝。

程序覆蓋安裝檢查:

(1)、兩個程序的入口Activity是否相同。兩個程序如果包名不一樣,即使其它所有代碼完全一樣,也不會被視爲同一個程序的不同版本;

(2)、兩個程序所採用的簽名是否相同。如果兩個程序所採用的簽名不同,即使包名相同,也不會被視爲同一個程序的不同版本,不能覆蓋安裝。

總結一下就是:簽名、包名相同,需覆蓋安裝。

        這裏有一個很簡單的例子:當我們在公司開發時,在自己電腦上調試的手機,多次調試時不需要卸載(此時是覆蓋安裝)。而當其他人拿了這個手機去他電腦上調試時,就需要先卸載該程序(必須卸載安裝)。當你以前的程序是採用默認簽名的方式(即debug簽名),一旦換了新的簽名應用將不能覆蓋安裝,必須將原先的程序卸載掉,才能安裝上。

        因此使用debug簽名的應用:無法在Android市場銷售;而且,不同機器生成的debug密鑰不同,不利apk升級和維護;debug簽名有一年有效期。使用獨立簽名的應用:可在Android市場銷售,簽名固定會更加便利apk升級和維護。

參考資料:

http://blog.csdn.net/wirelessqa/article/details/7651613

http://blog.csdn.net/lyq8479/article/details/6401093

http://blog.csdn.net/wenlin56/article/details/8153301

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章