(转) Android 数字签名
http://xusaomaiss.iteye.com/blog/1396324??
Android 數(shù)字簽名
????? 在Android系統(tǒng)中,所有安裝到系統(tǒng)的應(yīng)用程序都必有一個(gè)數(shù)字證書(shū),此數(shù)字證書(shū)用于 標(biāo)識(shí)應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,如果一個(gè)permission的protectionLevel為signature,那么就只有那些 跟該permission所在的程序擁有同一個(gè)數(shù)字證書(shū)的應(yīng)用程序才能取得該權(quán)限。Android使用Java的數(shù)字證書(shū)相關(guān)的機(jī)制來(lái)給apk加蓋數(shù)字證 書(shū),要理解android的數(shù)字證書(shū),需要先了解以下數(shù)字證書(shū)的概念和java的數(shù)字證書(shū)機(jī)制。Android系統(tǒng)要求每一個(gè)安裝進(jìn)系統(tǒng)的應(yīng)用程序都是經(jīng) 過(guò)數(shù)字證書(shū)簽名的,數(shù)字證書(shū)的私鑰則保存在程序開(kāi)發(fā)者的手中。Android將數(shù)字證書(shū)用來(lái)標(biāo)識(shí)應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,不是用來(lái)決 定最終用戶可以安裝哪些應(yīng)用程序。這個(gè)數(shù)字證書(shū)并不需要權(quán)威的數(shù)字證書(shū)簽名機(jī)構(gòu)認(rèn)證,它只是用來(lái)讓?xiě)?yīng)用程序包自我認(rèn)證的。
同一個(gè)開(kāi)發(fā)者的多個(gè)程序盡可能使用同一個(gè)數(shù)字證書(shū),這可以帶來(lái)以下好處。
(1)有利于程序升級(jí),當(dāng)新版程序和舊版程序的數(shù)字證書(shū)相同時(shí),Android系統(tǒng)才會(huì)認(rèn)為這兩個(gè)程序是同一個(gè)程序的不同版本。如果新版程序和舊版程序的數(shù)字證書(shū)不相同,則Android系統(tǒng)認(rèn)為他們是不同的程序,并產(chǎn)生沖突,會(huì)要求新程序更改包名。
(2)有利于程序的模塊化設(shè)計(jì)和開(kāi)發(fā)。Android系統(tǒng)允許擁有同一個(gè)數(shù)字簽名的程序運(yùn)行在一個(gè)進(jìn)程中,Android程序會(huì)將他們視為同一個(gè)程序。所以開(kāi)發(fā)者可以將自己的程序分模塊開(kāi)發(fā),而用戶只需要在需要的時(shí)候下載適當(dāng)?shù)哪K。
(3)可以通過(guò)權(quán)限(permission)的方式在多個(gè)程序間共享數(shù)據(jù)和代碼。Android提供了基于數(shù)字證書(shū)的權(quán)限賦予機(jī)制,應(yīng)用程序可以和其他的程序共 享概功能或者數(shù)據(jù)給那那些與自己擁有相同數(shù)字證書(shū)的程序。如果某個(gè)權(quán)限(permission)的protectionLevel是signature, 則這個(gè)權(quán)限就只能授予那些跟該權(quán)限所在的包擁有同一個(gè)數(shù)字證書(shū)的程序。
在簽名時(shí),需要考慮數(shù)字證書(shū)的有效期:
(1)數(shù)字證書(shū)的有效期要包含程序的預(yù)計(jì)生命周期,一旦數(shù)字證書(shū)失效,持有改數(shù)字證書(shū)的程序?qū)⒉荒苷I?jí)。
(2)如果多個(gè)程序使用同一個(gè)數(shù)字證書(shū),則該數(shù)字證書(shū)的有效期要包含所有程序的預(yù)計(jì)生命周期。
(3)Android Market強(qiáng)制要求所有應(yīng)用程序數(shù)字證書(shū)的有效期要持續(xù)到2033年10月22日以后。
Android數(shù)字證書(shū)包含以下幾個(gè)要點(diǎn):
(1)所有的應(yīng)用程序都必須有數(shù)字證書(shū),Android系統(tǒng)不會(huì)安裝一個(gè)沒(méi)有數(shù)字證書(shū)的應(yīng)用程序
(2)Android程序包使用的數(shù)字證書(shū)可以是自簽名的,不需要一個(gè)權(quán)威的數(shù)字證書(shū)機(jī)構(gòu)簽名認(rèn)證
(3)如果要正式發(fā)布一個(gè)Android ,必須使用一個(gè)合適的私鑰生成的數(shù)字證書(shū)來(lái)給程序簽名,而不能使用adt插件或者ant工具生成的調(diào)試證書(shū)來(lái)發(fā)布。
(4)數(shù)字證書(shū)都是有有效期的,Android只是在應(yīng)用程序安裝的時(shí)候才會(huì)檢查證書(shū)的有效期。如果程序已經(jīng)安裝在系統(tǒng)中,即使證書(shū)過(guò)期也不會(huì)影響程序的正常功能。
(5)Android使用標(biāo)準(zhǔn)的java工具 Keytool and Jarsigner 來(lái)生成數(shù)字證書(shū),并給應(yīng)用程序包簽名。
(6)使用zipalign優(yōu)化程序。
Android系統(tǒng)不會(huì)安裝運(yùn)行任何一款未經(jīng)數(shù)字簽名的apk程序,無(wú)論是在模擬器上還是在實(shí)際的物理設(shè)備上。Android的開(kāi)發(fā)工具(ADT插件和Ant)都可以協(xié) 助開(kāi)發(fā)者給apk程序簽名,它們都有兩種模式:調(diào)試模式(debug mode)和發(fā)布模式(release mode)。
在調(diào)試模式下,android的開(kāi)發(fā)工具會(huì)在每次編譯時(shí)使用調(diào)試用的數(shù)字證書(shū)給程序簽名,開(kāi)發(fā)者無(wú)須關(guān)心。
當(dāng)要發(fā)布程序時(shí),開(kāi)發(fā)者就需要使用自己的數(shù)字證書(shū)給apk包簽名,可以有兩種方法。
(1)在命令行下使用JDK中的和Keytool(用于生成數(shù)字證書(shū))和Jarsigner(用于使用數(shù)字證書(shū)簽名)來(lái)給apk包簽名。
(2)使用ADT Export Wizard進(jìn)行簽名(如果沒(méi)有數(shù)字證書(shū)可能需要生成數(shù)字證書(shū))。
使用Keytool和Jarsigner給程序簽名
命令:keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -validity 20000
該 命令中,-keystore ophone.keystore 表示生成的證書(shū),可以加上路徑(默認(rèn)在用戶主目錄下);-alias ophone 表示證書(shū)的別名是ophone;-keyalg RSA 表示采用的RSA算法;-validity 20000表示證書(shū)的有效期是20000天。
此時(shí),我們會(huì)在互用主目錄下看到ophone.keystore,即我們剛剛創(chuàng)建的證書(shū)。
接著對(duì)程序進(jìn)行簽名:
jarsigner用法: [選項(xiàng)] jar 文件別名 jarsigner -verify [選項(xiàng)] jar 文件
執(zhí) 行:jarsigner -verbose -keystore android.keystore -signedjar? android123_signed.apk android123.apk android 就可以生成簽名的apk文件,這里輸入文件android123.apk,最終生成android123_signed.apk為Android簽名后的APK執(zhí)行文件。下面提示輸入的密碼和keytool輸入的一樣就行了。(不過(guò)在我的JDK目錄下沒(méi)有找到j(luò)arsigner這個(gè)程序,不知道是怎么回 事)
使用ADT Export Wizard進(jìn)行簽名
應(yīng)用程序(apk)簽名,在EC中,右鍵單擊應(yīng)用程序工程,如圖選擇
選擇證書(shū)的存放路徑,填寫(xiě)相關(guān)資料,完成,即可生成被簽名的apk文件。如下圖所示:
如上圖所示,我們可以看到也可以在這里選擇”Create new keystore“來(lái)創(chuàng)建一個(gè)證書(shū)。輸入密碼,點(diǎn)擊下一步,填寫(xiě)相關(guān)信息,如下圖所示。
使用zipalign優(yōu)化APK
根據(jù)官方文檔的描述,Android系統(tǒng)中Application的數(shù)據(jù)都保存在它的APK文件中,同時(shí)可以被多個(gè)進(jìn)程訪問(wèn),安裝的過(guò)程包括如下幾個(gè)步驟:
Installer通過(guò)每個(gè)apk的manifest文件獲取與當(dāng)前應(yīng)用程序相關(guān)聯(lián)的permissions信息
Home application讀取當(dāng)前APK的Name和Icon等信息。
System server將讀取一些與Application運(yùn)行相關(guān)信息,例如:獲取和處理Application的notifications請(qǐng)求等。
最后,APK所包含的內(nèi)容不僅限于當(dāng)前Application所使用,而且可以被其它的Application調(diào)用,提高系統(tǒng)資源的可復(fù)用性。
zipalign優(yōu)化的最根本目的是幫助操作系統(tǒng)更高效率的根據(jù)請(qǐng)求索引資源,將resource-handling code統(tǒng)一將Data structure? alignment(數(shù) 據(jù)結(jié)構(gòu)對(duì)齊標(biāo)準(zhǔn):DSA)限定為4-byte boundaries。如果不采取對(duì)齊的標(biāo)? 準(zhǔn),處理器無(wú)法準(zhǔn)確和快速的在內(nèi)存地址中定位相關(guān)資源。目前的系統(tǒng)中使用fallback? mechanism機(jī)制處理那些沒(méi)有應(yīng)用DSA標(biāo)準(zhǔn)的應(yīng)用程序,這的確大大的方便了普通開(kāi)發(fā)者無(wú)需關(guān)注繁瑣的內(nèi)存操作問(wèn)題。但是相反,對(duì)于這樣的應(yīng)用程序 將給普通用戶帶來(lái)一定的麻煩,不但影響程序的運(yùn)行的效率,而且使系統(tǒng)的整體執(zhí)行效率下降和占用大量不必要的內(nèi)存資源,甚至消耗一定的電池資源 (battery life)。
命令行方式手動(dòng)優(yōu)化:
利用tools文件夾下的zipalign工具。首先調(diào)出cmd命令行,然后執(zhí)行:zipalign -v 4 source.apk androidres.apk。這個(gè)方法不受API Level的限制,可以對(duì)任何版本的APK執(zhí)行Align優(yōu)化。
同時(shí)可以利用zipalign工具檢查當(dāng)前APK是否已經(jīng)執(zhí)行過(guò)Align優(yōu)化。命令:zipalign -c -v 4 androidres.apk
使用ADT自動(dòng)優(yōu)化:
從 ADT 0.9.3版本開(kāi)始,可以通過(guò)export wizard自動(dòng)對(duì)發(fā)布的application? packages執(zhí)行align操作。設(shè)置方法:鼠標(biāo)右鍵點(diǎn)擊Project,然后選擇”Android Tools” > “Export? Signed Application Package…”。
綜上所述,可以使用Keytool、Jarsigner、zipalign 給程序簽名并優(yōu)化程序,這樣就需要三個(gè)不同的工具:
keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -validity 20000
jarsigner -verbose -keystore android.keystore -signedjar android123_signed.apk android123.apk android
zipalign -v 4 android123_signed.apk android123_signed_aligned.apk
當(dāng)然,也可以通過(guò)ADT插件中Export Signed Application Package…來(lái)執(zhí)行,圖形界面更為簡(jiǎn)單、形象、直觀。
參考:blog.csdn.net/zgfee/archive/2009/11/11/4796831.aspx
Android SDK:androidappdocs.appspot.com/guide/publishing/app-signing.html
android123.com.cn/androidkaifa/173.html
yarin.javaeye.com/blog/549280
androidres.com/index.php/2009/10/18/use-zipalign-to-optimize-your-application-packages/
轉(zhuǎn)載于:https://www.cnblogs.com/Jessy/archive/2012/02/08/2342770.html
總結(jié)
以上是生活随笔為你收集整理的(转) Android 数字签名的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WebBrowser1.Navigate
- 下一篇: web请求解析过程