日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Android 簽名機(jī)制:Key的產(chǎn)生方法和簽名原理

 quasiceo 2014-11-19

Android 簽名機(jī)制:Key的產(chǎn)生方法和簽名原理  

2014-03-05 11:32:59|  分類: 默認(rèn)分類 |  標(biāo)簽:android  apk簽名   |舉報(bào) |字號(hào) 訂閱

apk簽名作用:
  在Android 系統(tǒng)中,所有安裝 到 系統(tǒng)的應(yīng)用程序都必有一個(gè)數(shù)字證書,此數(shù)字證書用于標(biāo)識(shí)應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,如果一個(gè) permission的protectionLevel為signature,那么就只有那些跟該permission所在的程序擁有同一個(gè)數(shù)字證書的應(yīng) 用程序才能取得該權(quán)限。Android使用Java的數(shù)字證書相關(guān)的機(jī)制來 給apk加蓋數(shù)字證書,要理解android的數(shù)字證書,需要先了解以下數(shù)字證書的概念和java的數(shù)字證書機(jī)制。Android系統(tǒng)要求每一個(gè)安裝進(jìn)系 統(tǒng)的應(yīng)用程序都是經(jīng)過數(shù)字證書簽名的,數(shù)字證書的私鑰則保存在程序開發(fā)者的手中。Android將數(shù)字證書用來標(biāo)識(shí)應(yīng)用程序的作者和在應(yīng)用程序之間建立信 任關(guān)系,不是用來決定最終用戶可以安裝哪些應(yīng)用程序。這個(gè)數(shù)字證書并不需要權(quán)威的數(shù)字證書簽名機(jī)構(gòu)認(rèn)證,它只是用來讓應(yīng)用程序包自我認(rèn)證的;也是用來判斷該應(yīng)用是否被別人破解,二次打包的一個(gè)標(biāo)準(zhǔn),但是簽名并不能防止被破解。

Android數(shù)字證書包含以下幾個(gè)要點(diǎn):

(1)所有的應(yīng)用程序都必須有數(shù)字證書 ,Android系統(tǒng)不會(huì)安裝一個(gè)沒有數(shù)字證書的應(yīng)用程序;
 (2)Android程序包使用的數(shù)字證書可以是自簽名的,不需要一個(gè)權(quán)威的數(shù)字證書機(jī)構(gòu)簽名認(rèn)證;
 (3)如果要正式發(fā)布 一個(gè)Android ,必須使用一個(gè)合適的私鑰生成的數(shù)字證書來給程序簽名 ,而不能使用adt插件 或者ant工具 生成的調(diào)試證書來發(fā)布。
 (4)數(shù)字證書都是有有效期 的,Android只是在應(yīng)用程序安裝的時(shí)候才會(huì)檢查證書的有效期。如果程序已經(jīng)安裝在系統(tǒng)中,即使證書過期也不會(huì)影響程序的正常功能。
(5)Android使用標(biāo)準(zhǔn)的java工具 Keytool and Jarsigner 來生成數(shù)字證書,并給應(yīng)用程序包簽名。
(6)使用zipalign 優(yōu)化 程序。


簽名原理:
Android系統(tǒng)簽名主要有ROM簽名和應(yīng)用程序APK簽名兩種形式。ROM簽名是針對(duì)已經(jīng)生成的Android系統(tǒng)ROM包進(jìn)行簽名。應(yīng)用程序APK簽名是針對(duì)開發(fā)者開發(fā)的應(yīng)用程序安裝包APK進(jìn)行簽名。前者是對(duì)整個(gè)Android系統(tǒng)包簽名,后者只對(duì)Android系統(tǒng)中一個(gè)應(yīng)用程序APK簽名。
Android 應(yīng)用程序APK是jar包,簽名采用的工具是signapk.jar包,對(duì)應(yīng)用程序安裝包簽名的執(zhí)行命令如下:
java -jar signapk.jar publickey privatekey input.apk output.apk

此命令實(shí)現(xiàn)了對(duì)應(yīng)用程序安裝包input.apk簽名的功能。在signapk.jar命令中,第一個(gè)參數(shù)為公鑰publickey,第二個(gè)參數(shù)為私鑰privatekey,第三個(gè)參數(shù)為輸入的包名,第四個(gè)參數(shù)簽名后生成的輸出包名。在此命令中,signapk.jar使用公鑰publickey和私鑰privatekey對(duì)input.apk安裝包進(jìn)行簽名,生成output.apk包。signapk源碼位于build/tools/signapk/SignApk.java中。

  完成簽名后APK包中多了一個(gè)META-INF文件夾,其中有名為MANIFEST.MF、CERT.SF和CERT.RSA的三個(gè)文件。MANIFEST.MF文件中包含很多APK包信息,如manifest文件版本、簽名版本、應(yīng)用程序相關(guān)屬性、簽名相關(guān)屬性等。CERT.SF是明文的簽名證書,通過采用私鑰進(jìn)行簽名得到。CERT.RSA是密文的簽名證書,通過公鑰生成的。MANIFEST.MF、CERT.SF和CERT.RSA三個(gè)文件所使用的公鑰和私鑰的生成可以通過 development/tools/make_key 來獲得。下面分別介紹MANIFEST.MF、CERT.SF和CERT.RSA三個(gè)文件的生成方法。

(1)生成MANIFEST.MF文件

生成MANIFEST.MF是對(duì)APK包中所有未簽名文件逐個(gè)用算法SHA1進(jìn)行數(shù)字簽名,再對(duì)數(shù)字簽名信息采用Base64進(jìn)行編碼,最后將編完碼的簽名寫入MANIFEST.MF文件中。添加數(shù)字簽名到manifest文件通過調(diào)用addDigestsToManifest方法實(shí)現(xiàn),具體代碼如下:

(簡(jiǎn)言之:MANIFESt.MF 文件中的內(nèi)容就是通過遍歷apk中所有文件(entry),逐一生成SHA-1數(shù)字簽名,然后通過Base64編碼轉(zhuǎn)碼

  1. private static Manifest addDigestsToManifest(JarFile jar)  
  2. {  
  3.  ……  
  4.  //遍歷update.apk包中所有文件  
  5.  //得到簽名文件內(nèi)容  
  6.  InputStream data = jar.getInputStream(entry);  
  7.  
  8.  //更新文件內(nèi)容  
  9.  while ((num = data.read(buffer)) > 0) {  
  10.   md.update(buffer, 0, num);  
  11.  }  
  12.  ……  
  13.     //進(jìn)行SHA1簽名,并采用Base64進(jìn)行編碼  
  14.  attr.putValue("SHA1-Digest", base64.encode(md.digest()));  
  15.  output.getEntries().put(name, attr);  
  16.  ……  
  17. }  

需要說明,生成MANIFEST.MF使用了SHA1算法進(jìn)行數(shù)字簽名,SHA1是一種Hash算法,兩個(gè)不同的信息經(jīng)Hash運(yùn)算后不會(huì)產(chǎn)生同樣的信息摘要,由于SHA1是單向的,所以不可能從消息摘要中復(fù)原原文。如果惡意程序改變了APK包中的文件,那么在進(jìn)行APK安裝校驗(yàn)時(shí),改變后的摘要信息與MANIFEST.MF的檢驗(yàn)信息不同,應(yīng)用程序便不能安裝成功。


(2)生成CERT.SF文件

在生成MANIFEST.MF文件之后,用SHA1-RSA算法對(duì)其進(jìn)行私鑰簽名(使用SHA1-RSA算法,用私鑰對(duì)MANIFEST.MF摘要文件簽名,并對(duì)其中每個(gè)文件摘要簽名),便生成CERT.SF。具體代碼如下:

  1. Signature signature = Signature.getInstance("SHA1withRSA");  
  2. signature.initSign(privateKey);  
  3. je = new JarEntry(CERT_SF_NAME);  
  4. je.setTime(timestamp);  
  5. outputJar.putNextEntry(je);  
  6. writeSignatureFile(manifest, newSignatureOutputStream(outputJar, signature)); 

RSA是目前最有影響力的公鑰加密算法,是一種非對(duì)稱加密算法、能夠同時(shí)用于加密和數(shù)字簽名。由于RSA是非對(duì)稱加密算法,因此用私鑰對(duì)生成MANIFEST.MF的數(shù)字簽名加密后,在APK安裝時(shí)只能使用公鑰才能解密它。

(3)生成CERT.RSA文件

生成CERT.RSA文件與生成CERT.SF文件不同之處在于,生成CERT.RSA文件使用了公鑰文件。CERT.RSA文件中保存了公鑰以及所用的采用加密算法等信息。具體代碼如下:

  1. je = new JarEntry(CERT_RSA_NAME);  
  2. je.setTime(timestamp);  
  3. outputJar.putNextEntry(je);  
  4. writeSignatureBlock(signature, publicKey, outputJar); 

通過以上對(duì)Android應(yīng)用程序簽名的代碼分析,可以看出Android系統(tǒng)通過對(duì)第三方APK包進(jìn)行簽名,達(dá)到保護(hù)系統(tǒng)安全的目的。應(yīng)用程序簽名主要用于對(duì)開發(fā)者身份進(jìn)行識(shí)別,達(dá)到防范惡意攻擊的目的,但不能有效地限制應(yīng)用程序被惡意修改,只能夠檢測(cè)應(yīng)用程序是否被修改過,如果應(yīng)用程序被修改應(yīng)該再采取相應(yīng)的應(yīng)對(duì)措施。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多