android利用數位憑證對程式簽名

來源:互聯網
上載者:User

 簽名的必要性

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

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

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

簽名方式

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

1、  在Eclipse下通過外掛程式擷取數位憑證,並簽名你的應用。

        開啟Eclipse->選擇你要簽名的項目->右擊->android tools->Export signedApplication package,再進行相關操作。這裡首先需要建立數位憑證,然後再利用數位憑證簽名你的應用。

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

2、  用KeyTool產生數位憑證檔案,再簽名你的應用。

命令:

keytool -genkey -v -keystore D:\Users\Administrator\Desktop\mytest.keystore-alias mytest -keyalg RSA -validity 20000

其中參數含義如下:

-keystore D:\Users\Administrator\Desktop\mytest.keystore表示產生的認證及其存放路徑,預設在使用者主目錄下;-alias mytest 表示認證的別名是mytest;-keyalg RSA 表示採用的RSA演算法;-validity 20000表示認證的有效期間是20000天。

這樣你就會在相應目錄下獲得所需的數位憑證,如所示。

擷取到數位憑證之後,你就可以用數位憑證去簽名你的應用,簽名步驟如下:

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

補充:

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

1、擷取認證指紋(MD5)命令:

 

  keytool -list -alias mytest -keystore D:\Users\Administrator\Desktop\mytest.keystore

2、擷取認證指紋(SHA1)命令:

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.