版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Android應(yīng)用簽名機(jī)理什么是簽名?Android要求所有已安裝的應(yīng)用程序都使用數(shù)字證書(shū)做數(shù)字簽名,數(shù)字證書(shū)的私鑰由應(yīng)用開(kāi)發(fā)者持有。Android使用證書(shū)作為標(biāo)識(shí)應(yīng)用程序作者的一種方式,并在應(yīng)用程序之間建立信任關(guān)系。
證書(shū)并不用來(lái)控制用戶能否安裝哪個(gè)應(yīng)用。
證書(shū)不需要由證書(shū)認(rèn)證中心簽名:完全可以使用自簽名證書(shū)(self-signedcertificates)。沒(méi)有正確簽名的應(yīng)用,Android系統(tǒng)不會(huì)安裝或運(yùn)行。此規(guī)則適用于在任何地方運(yùn)行的Android系統(tǒng),不管是在模擬器還是真實(shí)設(shè)備上。
因?yàn)檫@個(gè)原因,在真機(jī)或模擬器上運(yùn)行或者調(diào)試應(yīng)用前,必須為其設(shè)置好簽名。為什么需要簽名?開(kāi)發(fā)Android的人很多,完全很能把類名、包名起成了同樣名字,這時(shí)候如何區(qū)分?簽名可以區(qū)分。開(kāi)發(fā)商或惡意開(kāi)發(fā)者可能通過(guò)相同的包名混淆替換已安裝應(yīng)用。簽名可以保證相同包名但是簽名不同的包不被替換。應(yīng)用如果使用一種key簽名,另一個(gè)key簽名的文件將無(wú)法安裝或覆蓋老的版本。防止已安裝的應(yīng)用被惡意的第三方覆蓋或替換。簽名可以防止交易抵賴。簽名策略推薦策略:在應(yīng)用程序的整個(gè)生命周期,所有的應(yīng)用程序使用相同的證書(shū)簽名。Why?主要基于下面幾種考慮:應(yīng)用程序升級(jí)應(yīng)用程序模塊化代碼/數(shù)據(jù)的授權(quán)共享--------------------------------------------------------------------如何設(shè)置簽名應(yīng)用key的有效期?確認(rèn)key的有效期要比應(yīng)用的壽命長(zhǎng),
推薦25年或者更長(zhǎng)的有效期。Debug模式下的簽名當(dāng)用debug證書(shū)簽名時(shí),應(yīng)用程序不能對(duì)外發(fā)布。公開(kāi)發(fā)布應(yīng)用如何簽名?1.使用命令2.使用Eclipse/ADT3.使用ANT1.使用命令(1)獲取一個(gè)合適的私鑰(2)在release模式下編譯應(yīng)用程序(3)使用你的私鑰對(duì)應(yīng)用程序進(jìn)行簽名(4)使用zipalign來(lái)調(diào)整和優(yōu)化APK包(1)獲取一個(gè)合適的私鑰通過(guò)Keytool生成一個(gè)自簽名的key。Keytool選項(xiàng)描述-genkey生成一個(gè)keypair(公鑰和私鑰)-v允許詳細(xì)內(nèi)容輸出.-alias<alias_name>key的別名.只會(huì)用到前8個(gè)字符.-keyalg<alg>生成key時(shí)的加密算法.支持DSA和RSA.-keysize<size>生成的key的大小(bits).如果不提供,Keytool使用默認(rèn)的Key大小:1024.
通常情況下,我們推薦使用2048或者更大的key尺寸.-dname<name>描述key的創(chuàng)建者的標(biāo)識(shí)名稱.
在自簽名證書(shū)中,本參數(shù)會(huì)出現(xiàn)在發(fā)布者和主題字段.
注意,不要在命令行下指定這個(gè)選項(xiàng).此時(shí)Jarsigner會(huì)提示你輸入每一個(gè)標(biāo)識(shí)名稱字段(CN,OU,等)-keypass<password>key的密碼.安全起見(jiàn),不要在命令行中包含這個(gè)選項(xiàng).
此時(shí)Keytool會(huì)提示你輸入密碼.
這種方式中,密碼不會(huì)被保存在shell歷史數(shù)據(jù)中.-validity<valdays>key的有效期,以天數(shù)為單位.
注意:推薦使用10000或更大的數(shù)字.-keystore<keystore-name>.keystore保存私鑰的keystore名稱.-storepass<password>keystore的密碼.
安全起見(jiàn),不要在命令行中包含這個(gè)選項(xiàng).
此時(shí),Keytool會(huì)提示輸入這個(gè)密碼.
在這種方式中,密碼不會(huì)被保存在shell歷史數(shù)據(jù)中.
$keytool-genkey-v-keystoremy-release-key.keystore-aliasalias_name-keyalgRSA-keysize2048-validity10000(2)在release模式下編譯應(yīng)用程序使用Eclipse要從Eclipse導(dǎo)出一個(gè)未簽名的.apk,在PackageExplorer中的project上點(diǎn)擊鼠標(biāo)右鍵,選擇AndroidTools>ExportUnsignedApplicationPackage。然后給未簽名的.apk指定一個(gè)文件路徑。(或者在Eclipse中打開(kāi)AndroidManifest.xml文件,點(diǎn)開(kāi)Overview標(biāo)簽,然后點(diǎn)擊Exportanunsigned.apk.)注意,完全可以在ExportWizard中執(zhí)行整個(gè)的編譯和簽名步驟。(3)使用你的私鑰對(duì)應(yīng)用程序進(jìn)行簽名運(yùn)行Jarsigner對(duì)應(yīng)用簽名,同時(shí)引用應(yīng)用的.apk和用來(lái)簽名.apk的私鑰的keystore。Jarsigner選項(xiàng)Description-keystore<keystore-name>.keystore包含私鑰的keystore的名稱.-verbose允許詳細(xì)輸出.-storepass<password>keystore的密碼,安全起見(jiàn),不要把此參數(shù)包含在命令行中.
此時(shí),Jarsigner提示輸入密碼.
這種方式下,密碼不會(huì)被保存在shell的歷史記錄中.
-keypass<password>私鑰的密碼.
安全起見(jiàn),不要把此參數(shù)包含在命令行中.
此時(shí),Jarsigner提示輸入密碼.
這種方式下,密碼不會(huì)被保存在shell的歷史記錄中.簽名例子:$jarsigner-verbose-keystoremy-release-key.keystoremy_application.apkalias_name檢查簽名是否成功:$jarsigner-verifymy_signed.apk檢查簽名詳細(xì)信息:$jarsigner-verify-verbose-certsmy_application.apk
(4)使用zipalign來(lái)調(diào)整和優(yōu)化APK包安裝在某個(gè)設(shè)備上時(shí),確保4字節(jié)邊界對(duì)齊的方式,提供了性能上的優(yōu)化。當(dāng)對(duì)齊后,如果它們包含有對(duì)齊限制的二進(jìn)制數(shù)據(jù),Android系統(tǒng)甚至可以使用mmap()讀取文件,而不是從包里復(fù)制所有的數(shù)據(jù).。另一個(gè)好處是在運(yùn)行程序時(shí),減少了內(nèi)存消耗。zipalign工具由AndroidSDK提供,在tools/目錄中。
要調(diào)整對(duì)齊簽名后的.apk,執(zhí)行如下命令:$zipalign-v4your_project_name-unaligned.apkyour_project_name.apk警告:在使用zipalign優(yōu)化包之前,輸入的.apk必須使用私鑰簽名過(guò)。如果在zipalign之后簽名,將使之前優(yōu)化對(duì)齊操作無(wú)效,回到未優(yōu)化的狀態(tài)。2.使用Eclipse/ADT如果使用Eclipse和ADT插件,可以用ExportWizard來(lái)導(dǎo)出一個(gè)簽名的.apk(如果必要,甚至可以創(chuàng)建一個(gè)新的keystore.)ExportWizard為你處理所有Keytool和Jarsigner的交互操作,這允許使用一個(gè)GUI界面來(lái)操作簽名包的過(guò)程,而不必人工處理各種編譯,簽名,以及優(yōu)化對(duì)齊工作。
一旦向?qū)Ь幾g并簽名完.apk包,它將也使用zipalign對(duì)包進(jìn)行優(yōu)化對(duì)齊處理.因?yàn)镋xportWizard使用到Keytool和Jarsigner,應(yīng)當(dāng)確保在電腦上可以訪問(wèn)到這2樣工具。(1)在PackageExplorer中選中project,然后選擇File>Export(2)打開(kāi)Android文件夾,選擇ExportAndroidApplication,然后點(diǎn)擊Next(3)ExportAndroidApplication向?qū)ч_(kāi)始,它將引導(dǎo)你進(jìn)行簽名的整個(gè)過(guò)程,包括選擇用于簽名.apk的私鑰(或者創(chuàng)建一個(gè)新的keystore和私鑰)(4)完成ExportWizard后,應(yīng)用程序?qū)⒈痪幾g,簽名,對(duì)齊,做好了發(fā)布前的所有準(zhǔn)備保證私鑰安全下面是一些保證key的安全性的小提示。對(duì)keystore和key采用強(qiáng)密碼當(dāng)用Keytool生成key時(shí),不要在命令行提供-storepass和-keypass選項(xiàng)參數(shù)。如果非這么做,你的密碼將能夠在shell歷史中查到,這樣將導(dǎo)致任何用戶都能訪問(wèn)類似地,當(dāng)使用Jarsigner簽名應(yīng)用時(shí),不要在命令行提供-storepass和-keypass參數(shù)選項(xiàng)不要給任何人你的私鑰,不要讓未經(jīng)授權(quán)的人知道你的keystore和key密碼系統(tǒng)簽名Auto-Sign工具的一條批處理命令:java-jarsignapk.jartestkey.x509.pemtestkey.pk8update.zipupdate_signed.zip這條命令的意義是:通過(guò)signapk.jar這個(gè)可執(zhí)行jar包,以testkey.x509.pem這個(gè)公鑰文件和testkey.pk8這個(gè)私鑰文件對(duì)update.apk進(jìn)行簽名,簽名后的文件保存為update_signed.apk”。
系統(tǒng)簽名signapk.jar是Android源碼包中的一個(gè)簽名工具。由于Android是個(gè)開(kāi)源項(xiàng)目,所以,很高興地,我們可以直接找到signapk.jar的源碼!路徑為/build/tools/signapk/SignApk.java。對(duì)比一個(gè)沒(méi)有簽名的APK和一個(gè)簽名好的APK,我們會(huì)發(fā)現(xiàn),簽名好的APK包中多了一個(gè)叫做META-INF的文件夾。里面有三個(gè)文件,分別名為MANIFEST.MF、CERT.SF和CERT.RSA。signapk.jar就是生成了這幾個(gè)文件(其他文件沒(méi)有任何改變。因此我們可以很容易去掉原有簽名信息)。
系統(tǒng)簽名1.生成MANIFEST.MF文件關(guān)鍵代碼如下:
(1)Manifestmanifest=addDigestsToManifest(inputJar);
(2)je=newJarEntry(JarFile.MANIFEST_NAME);
(3)je.setTime(timestamp);
(4)outputJar.putNextEntry(je);
(5)manifest.write(outputJar);這里簡(jiǎn)單介紹下SHA1數(shù)字簽名。簡(jiǎn)單地說(shuō),它就是一種安全哈希算法,類似于MD5算法。它把任意長(zhǎng)度的輸入,通過(guò)散列算法變成固定長(zhǎng)度的輸出(這里我們稱作“摘要信息”)。你不能僅通過(guò)這個(gè)摘要信息復(fù)原原來(lái)的信息。另外,它保證不同信息的摘要信息彼此不同。因此,如果你改變了apk包中的文件,那么在apk安裝校驗(yàn)時(shí),改變后的文件摘要信息與MANIFEST.MF的檢驗(yàn)信息不同,于是程序就不能成功安裝。
系統(tǒng)簽名2.生成CERT.SF文件對(duì)前一步生成的Manifest,使用SHA1-RSA算法,用私鑰進(jìn)行簽名。關(guān)鍵代碼如下:(1)Signaturesignature=Signature.getInstance("SHA1withRSA");
(2)signature.initSign(privateKey);
(3)je=newJarEntry(CERT_SF_NAME);
(4)je.setTime(timestamp);
(5)outputJar.putNextEntry(je);
(6)writeSignatureFile(manifest,
(7)newSignatureOutputStream(outputJar,signature));
RSA是一種非對(duì)稱加密算法。用私鑰通過(guò)RSA算法對(duì)摘要信息進(jìn)行加密。在安裝時(shí)只能使用公鑰才能解密它。解密之后,將它與未加密的摘要信息進(jìn)行對(duì)比,如果相符,則表明內(nèi)容沒(méi)有被異常修改。
系統(tǒng)簽名3.生成CERT.RSA文件生成MANIFEST.MF沒(méi)有使用密鑰信息,生成CERT.SF文件使用了私鑰文件。那么我們可以很容易猜測(cè)到,CERT.RSA文件的生成肯定和公鑰相關(guān)。CERT.RSA文件中保存了公鑰、所采用的加密算法等信息。核心代碼如下:(1)je=newJarEntry(CERT_RSA_NAME);
(2)je.setTime(timestamp);
(3)outpu
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 童小點(diǎn)機(jī)器人課程設(shè)計(jì)
- 機(jī)械課程設(shè)計(jì)連桿
- 籃球裁判課程設(shè)計(jì)
- 投標(biāo)課程設(shè)計(jì)問(wèn)題
- 電網(wǎng)無(wú)人機(jī)課程設(shè)計(jì)
- 2024年廣東省安全員《B證》考試題庫(kù)及答案
- 紅綠燈課程設(shè)計(jì)致謝
- 物流供應(yīng)鏈課程設(shè)計(jì)論文
- 新聞學(xué)課程設(shè)計(jì)
- 站場(chǎng)設(shè)備課程設(shè)計(jì)
- 古代小說(shuō)戲曲專題-形考任務(wù)2-國(guó)開(kāi)-參考資料
- GA/T 2133.1-2024便攜式微型計(jì)算機(jī)移動(dòng)警務(wù)終端第1部分:技術(shù)要求
- 人教版四年級(jí)上冊(cè)數(shù)學(xué)數(shù)學(xué)復(fù)習(xí)資料
- 個(gè)人營(yíng)業(yè)執(zhí)照注銷委托書(shū)范文
- SB/T 10439-2007醬腌菜
- 整理富怡服裝CAD的鍵盤(pán)快捷鍵
- 人教版(PEP)小學(xué)英語(yǔ)六年級(jí)上冊(cè)各單元知識(shí)點(diǎn)歸納(三年級(jí)起點(diǎn))
- 工作分析案例
- 會(huì)議記錄模板
- 戴維斯在線認(rèn)知量表及其簡(jiǎn)介
- 現(xiàn)代CMOS工藝基本流程
評(píng)論
0/150
提交評(píng)論