導航:首頁 > 操作系統 > android應用的簽名是什麼

android應用的簽名是什麼

發布時間:2023-09-14 11:25:56

『壹』 android api 簽名是什麼意思

android api 簽名是api調用的時候需要按照約定的參數生成一個字元串,對方接收到後校驗參數,合法後接受請求並返回結果。
所有android端的API的有效訪問URL包括以下三個部分:
1. 資源訪問路徑,如/v1/deal/find_deals;
2. 請求參數:即API對應所需的參數名和參數值param=value,多個請求參數間用&連接
如deal_id=1-85462&appkey=00000;
3. 簽名串,由簽名演算法生成

簽名演算法如下:
1. 對除appkey以外的所有請求參數進行字典升序排列;
2. 將以上排序後的參數表進行字元串連接,如...keyNvalueN;
3. 將app key作為前綴,將app secret作為後綴,對該字元串進行SHA-1計算,並轉換成16進制編碼;
4. 轉換為全大寫形式後即獲得簽名串
簽名串獲得後,將其作為sign參數附加到對應的URL中,即可正常訪問API。
注意:請保證HTTP請求數據編碼務必為UTF-8格式,URL也務必為UTF-8編碼格式。
參考代碼:

// 定義申請獲得的appKey和appSecret
String appkey = "XXXXXXXX";
String secret = "";
String apiUrl = "http://api.dianping.com/v1/business/find_businesses";

// 創建參數表
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("format", "json");
paramMap.put("city", "上海");
paramMap.put("latitude", "31.21524");
paramMap.put("longitude", "121.420033");
paramMap.put("category", "美食");
paramMap.put("region", "長寧區");
paramMap.put("limit", "20");
paramMap.put("radius", "2000");
paramMap.put("offset_type", "0");
paramMap.put("has_coupon", "1");
paramMap.put("has_deal", "1");
paramMap.put("keyword", "泰國菜");
paramMap.put("sort", "7");

// 對參數名進行字典排序
String[] keyArray = paramMap.keySet().toArray(new String[0]);
Arrays.sort(keyArray);

// 拼接有序的參數名-值串
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(appkey);
for (String key : keyArray)
{
stringBuilder.append(key).append(paramMap.get(key));
}

stringBuilder.append(secret);
String codes = stringBuilder.toString();

// 字元串連接示例
// XXXXXXXXcategory美食city上海formatjsonhas_coupon1has_deal1keyword泰國菜latitude31.21524limit20longitude121.420033offset_type0radius2000region長寧區sort7

// SHA-1編碼, 這里使用的是Apache codec,即可獲得簽名(shaHex()會首先將中文轉換為UTF8編碼然後進行sha1計算,使用其他的工具包請注意UTF8編碼轉換)
/*
* 以下sha1簽名代碼效果等同
* byte[] sha = org.apache.commons.codec.digest.DigestUtils.sha(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(codes));
* String sign = org.apache.commons.codec.binary.Hex.encodeHexString(sha).toUpperCase();
*/
String sign = org.apache.commons.codec.digest.DigestUtils.shaHex(codes).toUpperCase();

//簽名示例
//

『貳』 Android基礎『V1V2V3簽名』

基礎概念
簽名:在 APK 中寫入一個「指紋」。指紋寫入以後,APK 中有任何修改,都會導致這個指紋無效,Android 系統在安裝 APK 進行簽名校驗時就會不通過,從而保證了安全性。
摘要演算法: 使用一段簡單的看上去隨機的不可逆向的固定長度的字元串來表示一個文件的唯一性。 常見的摘要演算法如MD5(128個比特位)、SHA-1演算法(160/192/256個比特位)。
公鑰密碼體制:也稱非對稱演算法,特點是 公鑰是公開的 ,私鑰是保密的。常見的如:RSA。
展開討論一下RSA:

Android中的簽名方案
V1 :基於jarsigner(JDK自帶工具,使用keystore文件進行簽名) 或 apksigner(Android專門提供的,使用pk8、x509.pem進行簽名)。keystore和pk8/x509.pem可以相互轉換。
簽名原理:首先keystore文件包含一個MD5和一個SHA1摘要。 這也是很多開放平台需要我們上傳的摘要數據
簽名APK後會在META-INF文件夾下生產CERT.RSA、CERT.SF、MANIFEST.MF三個文件。

在apk中,/META-INF文件夾中保存著apk的簽名信息,一般至少包含三個文件,[CERT].RSA,[CERT].SF和MANIFEIST.MF文件。這三個文件就是對apk的簽名信息。
MANIFEST.MF中包含對apk中除了/META-INF文件夾外所有文件的簽名值,簽名方法是先SHA1()(或其他hash方法)在base64()。存儲形式是:Name加[SHA1]-Digest。
[CERT].SF是對MANIFEST.MF文件整體簽名以及其中各個條目的簽名。一般地,如果是使用工具簽名,還多包括一項。就是對MANIFEST.MF頭部信息的簽名,關於這一點前面源碼分析中已經提到。
[CERT].RSA包含用私鑰對[CERT].SF的簽名以及包含公鑰信息的數字證書。
  是否存在簽名偽造可能:
修改(含增刪改)了apk中的文件,則:校驗時計算出的文件的摘要值與MANIFEST.MF文件中的條目不匹配,失敗。
修改apk中的文件+MANIFEST.MF,則:MANIFEST.MF修改過的條目的摘要與[CERT].SF對應的條目不匹配,失敗。
修改apk中的文件+MANIFEST.MF+[CERT].SF,則:計算出的[CERT].SF簽名與[CERT].RSA中記錄的簽名值不匹配,失敗。
修改apk中的文件+MANIFEST.MF+[CERT].SF+[CERT].RSA,則:由於證書不可偽造,[CERT].RSA無法偽造。

V2 :7.0新增的
簽名後的包會被分為四部分
1. Contents of ZIP entries(from offset 0 until the start of APK Signing Block)
2. APK Signing Block
3. ZIP Central Directory
4. ZIP End of Central Directory
新應用簽名方案的簽名信息會被保存在區塊2(APK Signing Block) 中, 而區塊1( Contents of ZIP entries )、區塊3( ZIP Central Directory )、區塊4( ZIP End of Central Directory )是受保護的, 在簽名後任何對區塊1、3、4的修改都逃不過新的應用簽名方案的檢查

V3 :9.0新增的
格式大體和 v2 類似,在 v2 插入的簽名塊(Apk Signature Block v2)中,又添加了一個新快(Attr塊)
在這個新塊中,會記錄我們之前的簽名信息以及新的簽名信息,以 密鑰轉輪的方案,來做簽名的替換和升級。這意味著,只要舊簽名證書在手,我們就可以通過它在新的 APK 文件中,更改簽名 。
v3 簽名新增的新塊(attr)存儲了所有的簽名信息,由更小的 Level 塊,以 鏈表 的形式存儲。
其中每個節點都包含用於為之前版本的應用簽名的簽名證書,最舊的簽名證書對應根節點,系統會讓每個節點中的證書為列表中下一個證書簽名,從而為每個新密鑰提供證據來證明它應該像舊密鑰一樣可信。
這個過程有點類似 CA 證書的證明過程,已安裝的 App 的舊簽名,確保覆蓋安裝的 APK 的新簽名正確,將信任傳遞下去。
注意: 簽名方式只支持升級不支持降級,如安裝了V2的包,不能覆蓋替換為V1的包。

參考
Android App簽名(證書)校驗過程源碼分析
新一代開源Android渠道包生成工具Walle
Android 簽名機制 v1、v2、v3

『叄』 安卓簽名是什麼 安卓簽名是sha1嗎

Android簽名有什麼作用?

平時我們的程序可以在模擬器上安裝並運行,是因為在應用程序開發期間,由於是以Debug面試進行編譯的,因此ADT根據會自動用默認的密鑰和證書來進行簽名,而在以發布模式編譯時,apk文件就不會得到自動簽名,這樣就需要進行手工簽名。給apk簽名可以帶來以下好處:1.、應用程序升級:如果你希望用戶無縫升級到新的版本,那麼你必須用同一個證書進行簽名。這是由於只有以同一個證書簽名,系統才會允許安裝升級的應用程序。如果你採用了不同的證書,那麼系統會要求納漏山你的應用程序採用不同的包名稱,在這種情況下相當於安裝了一個全新的應用程序。如果想升級應用程序,簽名證書要相同,包名稱要相同!2、應用程序模塊化:Android系統可以允許同一個證書簽名的多個應用程序在一個進程里運行,系統實際把他們作為一個單個的應用程序,此時就可以把我們的應用程序以模塊的方式進行部署,而用戶可以獨立的升級其中的一個模塊3、代碼或者數據共享:Android提供了基於簽名的許可權機制,那麼一個應用程序就可以為另一個以相同證書簽名的應用程序公開自己的功能。以同一個證書對多個應用程序進行簽名,利用基於簽名的許可權檢查,你就可以在應用程序間以安全的方式共享代碼和數據了。不同的應用程序之間,想共享數據,或者共享代碼,那麼要讓他們運行在同一個進程中,而且要讓他們用相同的證書簽名。

apk簽名是什麼意思?

apk簽名相當於程序的身份識別代碼。

1、apk簽名用於程序編譯打包之後,手機在運行程序之前會先去驗證程序的簽名(可以看作類似於我們電腦上常搜運說的md5)是否合法,只有通過了驗證的文件才會被運行,所以簽名軟體的作用的讓文件通過手機的驗證為合法,不同的手機、系統是對應不同的簽名的。

2、可以用簽名工具來更改。比如手機簽名工具ZipSigner 2,可以對手機上的文件進行直接簽名,支持apk、zip及jar格式,方便刷機或漢化的朋友。有些愛好修改安卓apk軟體的用戶有時候需要對apk文件進行修改,但是如果在電腦上操作的話,打包簽名是十分復雜的,還必須安裝java環境,可以說打包一個包是十分麻煩的,這款簽名工具可以解決上述遇到的問題。

android中如何確認使用的是什麼平台簽名

一、判斷Apk是否簽名用命令:jarsigner -verify -verbose -certs 1、如果有Android Debug字樣就是debug2、如果洞中已經簽名: [證書的有效期為13-8-31 下午2:31至41-1-16 下午2:31]二、判斷Apk簽名是否一致jdk 需要安裝;想查demo.apk所使用的簽名的fingerprint,可以這樣做:1、查找apk里的rsa文件 Windows 平台: > jar tf demo .apk findstr RSA linux 平台: $ jar tf demo .apk grep RSA META-INF/CERT.RSA 2、 從apk中解壓rsa文件 jar xf demo .apk META-INF/CERT.RSA 3、獲取簽名的fingerprints keytool -printcert -file META-INF/CERT.RSA 證書指紋: MD5: 5A:5A:96:63:8E:EF:FC:66:9E:BC:1C:2A:A9:1E:E5:95 SHA1: 44:BD:33:2D:C5:21:AE:78:D5:04:92:1A:39:FD:AC:01:E2:32:3C:AB SHA256: 2F:C0:A3:8C:0D:42:84:70:48:78:44:A4:2E:64:5B:50:B3:B3:1E:33:94:62:A3:9F:2F:10:DD:EF:D7:CF:02:0B 簽名演算法名稱: SHA1withRSA 版本: 3 兩個apk是否同簽名,比較簽名的MD5碼或SHA1碼 ,一樣就是相同的,反之,不是。

Android簽名有什麼作用-apk簽名可以帶來的好處 詳細??

apk 簽名可以帶來的好處

所有的Android 應用程序都要求開發人員用一個證書進行數字簽名,Android 系統不會

安裝沒有進行簽名的應用程序。

平時我們的程序可以在模擬器上安裝並運行,是因為在應用程序開發期間,由於是以

Debug 面試進行編譯的,因此ADT 根據會自動用默認的密鑰和證書來進行簽名,而在以發

布模式編譯時,apk 文件就不會得到自動簽名,這樣就需要進行手工簽名。

給apk 簽名可以帶來以下好處:

1.、應用程序升級:如果你希望用戶無縫升級到新的版本,那麼你必須用同一個證書進

行簽名。這是由於只有以同一個證書簽名,系統才會允許安裝升級的應用程序。

如果你採用了不同的證書,那麼系統會要求你的應用程序採用不同的包名稱,在這種情

況下相當於安裝了一個全新的應用程序。如果想升級應用程序,簽名證書要相同,包名稱要相同!

2.、應用程序模塊化:Android 系統可以允許同一個證書簽名的多個應用程序在一個進

程里運行,系統實際把他們作為一個單個的應用程序,此時就可以把我們的應用程序以模塊

的方式進行部署,而用戶可以獨立的升級其中的一個模塊

3.、代碼或者數據共享:Android 提供了基於簽名的許可權機制,那麼一個應用程序就可

以為另一個以相同證書簽名的應用程序公開自己的功能。以同一個證書對多個應用程序進行

簽名,利用基於簽名的許可權檢查,你就可以在應用程序間以安全的方式共享代碼和數據了。

4.不同的應用程序之間,想共享數據,或者共享代碼,那麼要讓他們運行在同一個進程

中,而且要讓他們用相同的證書簽名。

標簽:作文經典 上一篇:夢見自己做飯什麼意思 夢見別人做飯什麼意思 下一篇:成語接龍民凋 民什麼凋什麼成語接龍

android api 簽名是什麼意思

android api 簽名是api調用的時候需要按照約定的參數生成一個字元串,對方接收到後校驗參數,合法後接受請求並返回結果。

所有android端的API的有效訪問URL包括以下三個部分:

1. 資源訪問路徑,如/v1/deal/find_deals;

2. 請求參數:即API對應所需的參數名和參數值param=value,多個請求參數間用&連接

如deal_id=1-85462&appkey=00000;

3. 簽名串,由簽名演算法生成

簽名演算法如下:

1. 對除appkey以外的所有請求參數進行字典升序排列;

2. 將以上排序後的參數表進行字元串連接,如...keyNvalueN;

3. 將app key作為前綴,將app secret作為後綴,對該字元串進行SHA-1計算,並轉換成16進制編碼;

4. 轉換為全大寫形式後即獲得簽名串

簽名串獲得後,將其作為sign參數附加到對應的URL中,即可正常訪問API。

注意:請保證HTTP請求數據編碼務必為UTF-8格式,URL也務必為UTF-8編碼格式。

參考代碼:

// 定義申請獲得的appKey和appSecret

String appkey = "XXXXXXXX";

String secret = "";

String apiUrl = "[api.dianping]";

// 創建參數表

Map paramMap = new HashMap ;

paramMap.put("format", "json");

paramMap.put("city", "上海");

paramMap.put("latitude", "31.21524");

paramMap.put("longitude", "121.420033");

paramMap.put("category", "美食");

paramMap.put("region", "長寧區");

paramMap.put("limit", "20");

paramMap.put("radius", "2000");

paramMap.put("offset_type", "0");

paramMap.put("has_coupon", "1");

paramMap.put("has_deal", "1");

paramMap.put("keyword", "泰國菜");

paramMap.put("sort", "7");

// 對參數名進行字典排序

String[] keyArray = paramMap.keySet.toArray(new String[0]);

Arrays.sort(keyArray);

// 拼接有序的參數名-值串

StringBuilder stringBuilder = new StringBuilder;

stringBuilder.append(appkey);

for (String key : keyArray)

{

stringBuilder.append(key).append(paramMap.get(key));

}

stringBuilder.append(secret);

String codes = stringBuilder.toString;

// 字元串連接示例

// XXXXXXXXcategory美食city上海formatjsonhas_coupon1has_deal1keyword泰國菜latitude31.21524limit20longitude121.420033offset_type0radius2000region長寧區sort7

// SHA-1編碼, 這里使用的是Apache codec,即可獲得簽名(shaHex會首先將中文轉換為UTF8編碼然後進行sha1計算,使用其他的工具包請注意UTF8編碼轉換)

/*

* 以下sha1簽名代碼效果等同

* byte[] sha = .apachemons.codec.digest.DigestUtils.sha(.apachemons.codec.binary.StringUtils.getBytesUtf8(codes));

* String sign = .apachemons.codec.binary.Hex.encodeHexString(sha).toUpperCase;

*/

String sign = .apachemons.codec.digest.DigestUtils.shaHex(codes).toUpperCase;

//簽名示例

//

android 應用簽名怎麼獲取

1、

下載簽名應用,在手機中運行,根據提示輸入程序的包名獲得一個apk簽名字元串,最後將這個字元串填到第一步的應用簽名欄處。保存即可正常調試應用了。

2、

選擇程序-右鍵——android tools——簽名發布,按步驟生成一個簽名keystore和一個經過簽名的apk,安裝該APK到手機。

3、

選擇自己的程序,右鍵運行到手機。

4、

android 應用簽名查看方法如下:

(1) debug的apk通過Eclipse查看,如下圖:

(2) 某個keystore簽名的應用,通過

Javakeytool-list-keystoreE:Trineakeystoreappsearch.keystore查看,會要求輸入簽名密碼,默認為android。

Android APK簽名有什麼用呢?

平時我們的程序可以在模擬器上安裝並運行,是因為在應用程序開發期間,由於是以 Debug 面試進行編譯的,因此ADT 根據會自動用默認的密鑰和證書來進行簽名,而在以發布模式編譯時,apk 文件就不會得到自動簽名,這樣就需要進行手工簽名。 給apk 簽名可以帶來以下好處: 1.、應用程序升級:如果你希望用戶無縫升級到新的版本,那麼你必須用同一個證書進行簽名。這是由於只有以同一個證書簽名,系統才會允許安裝升級的應用程序。 如果你採用了不同的證書,那麼系統會要求你的應用程序採用不同的包名稱,在這種情況下相當於安裝了一個全新的應用程序。如果想升級應用程序,簽名證書要相同,包名稱要相同! 2.、應用程序模塊化:Android 系統可以允許同一個證書簽名的多個應用程序在一個進程里運行,系統實際把他們作為一個單個的應用程序,此時就可以把我們的應用程序以模塊的方式進行部署,而用戶可以獨立的升級其中的一個模塊 3.、代碼或者數據共享:Android 提供了基於簽名的許可權機制,那麼一個應用程序就可以為另一個以相同證書簽名的應用程序公開自己的功能。以同一個證書對多個應用程序進行簽名,利用基於簽名的許可權檢查,你就可以在應用程序間以安全的方式共享代碼和數據了。 4.不同的應用程序之間,想共享數據,或者共享代碼,那麼要讓他們運行在同一個進程中,而且要讓他們用相同的證書簽名。

什麼 是 android系統 簽名

簽名後才可以正常安裝,可以保證軟體的唯一性,可以檢驗軟體是否他人盜用;

安卓開發的過程中簽名在什麼情況下會變更

簽名,是開發者對apk文件的加密,防止程序被盜版,因為Android系統是linux內核,程序的區分是通過包名package來區分的,那別人也可能開發一個同包名的應用,這時安桌系統就會判斷一下,如果簽名相同則替換,如果簽名不同則不允許安裝重復包名的應用。至於你說什麼時候變更,通常開發者是不能變更簽名的,你改了簽名程序就不能更新安裝了

運行android程序會默認生成簽名嗎

開發Android的人這么多,完全有可能大家都把類名,包名起成了一個同樣的名字,這時候如何區分?簽名這時候就是起區分作用的。

由於開發商可能通過使用相同的Package Name來混淆替換已經安裝的程序,簽名可以保證相當名字,但是簽名不同的包不被替換。

APK如果使用一個key簽名,發布時另一個key簽名的文件將無法安裝或覆蓋老的版本,這樣可以防止你已安裝的應用被惡意的第三方覆蓋或替換掉。

這樣簽名其實也是開發者的身份標識。交易中抵賴等事情發生時,簽名可以防止抵賴的發生。

二、簽名的注意事項

Android系統要求所有的程序經過數字簽名才能安裝,如果沒有可用的數字簽名,系統將不許安裝運行此程序。不管是模擬器還是真實手機。因此,在設備或者是模擬器上運行調試程序之前,必須為應用程序設置數字簽名。

Android簽名的數字證書不需要權威機構來認證,是開發者自己產生的數字證書,即所謂的自簽名。數字證書用來標識應用程序的作者和在應用程序之間建立信任關系,而不是用來決定最終用戶可以安裝哪些應用程序。

系統僅僅會在安裝的時候測試簽名證書的有效期,如果應用程序的簽名是在安裝之後才到期,那麼應用程序仍然可以正常啟用。

可以使用標准工具-Keytool and Jarsigner-生成密鑰,來簽名應用程序的.apk文件。

簽名後需使用zipalign優化程序。

模擬器開發環境,開發時通過ADB介面上傳的程序會先自動被簽有Debug許可權,然後才傳遞到模擬器。Eclipse菜單的Window -> Preferences -> Android –> Build 下顯示的是我們默認的調試用的簽名數字證書。

正式發布一個Android應用時,必須使用一個合適的私鑰生成的數字證書來給程序簽名,不能使用ADT插件或者ANT工具生成的調試證書來發布。

三、簽名方法:

1.使用Keytool 和jarsigner工具簽名(在jdk/bin目錄下)

1.生成簽名keystore:

確保電腦上安裝了JDK,因為我們將使用JDK自帶的創建和管理數字證書的工具Keytool。在命令行下輸入如下命令:

keytool -genkey -v -keystore app.keystore -alias alias_name -keyalg RSA -validity 20000

-alias 後面跟的是別名這里是alias_name

-keyalg 是加密方式這里是RSA

-validity 是有效期這里是20000

-keystore 就是要生成的keystore的名稱這里是app.keystore

然後按回車鍵

按回車後首先會提示你輸入的密碼:這個在簽名時要用的,要記住

然後會再確認你的密碼。

之後會依次叫你輸入姓名、組織單位、組織名稱、城市區域、省份名稱、國家代碼(CN)等。

2.簽名:

jarsigner -verbose -keystore app.keystore -signedjar app_signed.apk app.apk alias_name

-keystore: keystore的名稱

-signedjar app_signed.apk: 指定簽名後生成的APK名稱

app.apk: 目標APK

然後按回車:會要求輸入剛才設置的密碼,輸入後按回車就開始簽名了。

3.查看簽名:

jarsigner -verify app_signed.apk

查看是否簽名,如果已經簽名會列印 "jar verified".

jarsigner -verify -verbose -certs app_signed.apk

查看簽名詳細信息。

4.通過zipalign工具進行優化apk(android自帶的工具,./build/tools/zipalign)

zipalign -v 4 app_signed.apk androidres.apk 對apk優化

zipalign -c -v 4 androidres.apk 查看apk是否經過優化

2.使用eclipse ADT工具簽名

在Package Explorer 窗口,右鍵,選擇Android Tools--->Export Signed Application Package 然後按照提示一步一步,生成已簽名的apk。通過eclipse也可以導出未簽名的APK文件。

註:需要輸入兩次密碼,第一次是私鑰密碼,第二次時私鑰別名的密碼。

3.eclipse在debug模式下自動簽名(無須手動配置):

在debug模式下用eclipse 的ADT為android簽名,只要應用程序在eclipse下開發,系統就會自動給apk簽名和優化。

在Eclipse中Windows > Preferences > Android > Build可以看到你keysotre的位置;

四、生成Android系統簽名

上面講的Android數字簽名大多是與Android APK相關,做CTS 認證時,需要用到Android系統簽名。為什麼需要給Android系統簽個名才能進行CTS認證呢?原來我們通過make -j4編譯出來的system.img使用的是test key,這種類型的key只適用於開發階段,而且這種秘鑰是公開的,誰都可以使用。當發布一款android產品,就需要另外給整個系統簽個名,防止被別人盜用。這種系統就是release版本的Android系統。

1、生成加密key文件

要對Android系統進行簽名,需要生成四種類型的key文件。

a)releasekey (testkey)

b)media

c)shared

d)platform

1)進入/android_src/development/tools目錄。

2)使用make_key工具生成簽名文件。需要分別生成 releasekey,media,shared,platform。

./make_key releasekey '/C=CN/ST=JiangSu/L=NanJing/O=pany/OU=Department/CN=Your Name/emailAddress=YourE-mailAddress' (系統將會提示輸入針對各種key的密碼,按照提示輸入即可)

將會生成 releasekey.pk8 和 releasekey.x509.pem文件,其中 *.pk8是生成的私鑰,而*.x509.pem是公鑰,生成時兩者是成對出現的.

註:如果出現 openssl : relocation error :openssl : symbol ...嘗試用 sudo 執行命令,問題解決了!

2.回到根目錄android_src。

命令執行的時候都最好在工程的根目錄下執行,要不然腳本用到的某些文件找不到的。

3.編譯系統

make -j4 PRODUCT-generic-user dist

其中generic 表示生成的TARGET_PRODUCT類型為generic,

user代表TARGET_BUILD_VARIANT為user版本。

編譯完成之後回在android_src/dist/目錄內生成個proct_generic-user_files開頭的zip文件.這就是我們需要進行簽名的文件系統.

4.開始簽名

./build/tools/releasetools/sign_target_files_apks -d key_directory/ out/dist/proct_mol-target_files.zip out/dist/signed_target_files.zip

通過sign_target_files_apks 腳本,完成android系統的簽名工作.

key_directory/ 表示key所在的目錄。

out/dist/proct_mol-target_files.zip 源文件。

out/dist/signed_target_files.zip 生成簽名的目標文件。

可能會出現:

ERROR: no key specified for:

CalendarWidget.apk

Contacts_yellowpage.apk

SnsAppMain.apk

這表示,簽名並沒有成功,原因是由於有些apk程序已經簽過名了或者找不到對應的key. 這需要我們對apk設置過濾,不對上面的應用進行簽名.方法如下:

通過參數"-e =" 來過濾這些應用.

./build/tools/releasetools/sign_target_files_apks -d key_directory/ -e CalendarWidget.apk= -e Contacts_yellowpage.apk= -e SnsAppMain.apk= -e out/dist/proct_mol-target_files.zip out/dist/signed_target_files.zip

輸入該命令時會提示輸入key的密碼,會出現四次密碼輸入提示。分別為四種類型的key的密碼。

5.生成image文件

./build/tools/releasetools/img_from_target_files out/dist/signed-target-files.zip signed-img.zip

用img_from_target_files 命令對生成的igned-target-files.zip文件進行打包,signed-img.zip包含了boot.img,userdate.img,system.img文件等.

6.通過fastboot下載signed-img.zip文件

fastboot update signed-img.zip

通過fastboot就可以把簽了名的系統文件燒到手機上了。

標簽:作文經典 上一篇:夢見自己做飯什麼意思 夢見別人做飯什麼意思 下一篇:成語接龍民凋 民什麼凋什麼成語接龍

『肆』 Android V1及V2簽名原理簡析

Android為了保證系統及應用的安全性,在安裝APK的時候需要校驗包的完整性,同時,對於覆蓋安裝的場景還要校驗新舊是否匹配,這兩者都是通過Android簽名機制來進行保證的,本文就簡單看下Android的簽名與校驗原理,分一下幾個部分分析下:

簽名是摘要與非對稱密鑰加密相相結合的產物,摘要就像內容的一個指紋信息,一旦內容被篡改,摘要就會改變,簽名是摘要的加密結果,摘要改變,簽名也會失效。Android APK簽名也是這個道理,如果APK簽名跟內容對應不起來,Android系統就認為APK內容被篡改了,從而拒絕安裝,以保證系統的安全性。目前Android有三種簽名V1、V2(N)、V3(P),本文只看前兩種V1跟V2,對於V3的輪密先不考慮。先看下只有V1簽名後APK的樣式:

再看下只有V2簽名的APK包樣式:

同時具有V1 V2簽名:

可以看到,如果只有V2簽名,那麼APK包內容幾乎是沒有改動的,META_INF中不會有新增文件,按Google官方文檔:在使用v2簽名方案進行簽名時,會在APK文件中插入一個APK簽名分塊,該分塊位於zip中央目錄部分之前並緊鄰該部分。在APK簽名分塊內, 簽名和簽名者身份信息會存儲在APK簽名方案v2分塊中,保證整個APK文件不可修改 ,如下圖:

而V1簽名是通過META-INF中的三個文件保證簽名及信息的完整性:

V1簽名是如何保證信息的完整性呢?V1簽名主要包含三部分內容,如果狹義上說簽名跟公鑰的話,僅僅在.rsa文件中,V1簽名的三個文件其實是一套機制,不能單單拿一個來說事,

如果對APK中的資源文件進行了替換,那麼該資源的摘要必定發生改變,如果沒有修改MANIFEST.MF中的信息,那麼在安裝時候V1校驗就會失敗,無法安裝,不過如果篡改文件的同時,也修改其MANIFEST.MF中的摘要值,那麼MANIFEST.MF校驗就可以繞過。

CERT.SF個人覺得有點像冗餘,更像對文件完整性的二次保證,同繞過MANIFEST.MF一樣,.SF校驗也很容易被繞過。

CERT.RSA與CERT.SF是相互對應的,兩者名字前綴必須一致,不知道算不算一個無聊的標准。看下CERT.RSA文件內容:

CERT.RSA文件裡面存儲了證書公鑰、過期日期、發行人、加密演算法等信息,根據公鑰及加密演算法,Android系統就能計算出CERT.SF的摘要信息,其嚴格的格式如下:

從CERT.RSA中,我們能獲的證書的指紋信息,在微信分享、第三方SDK申請的時候經常用到,其實就是公鑰+開發者信息的一個簽名:

除了CERT.RSA文件,其餘兩個簽名文件其實跟keystore沒什麼關系,主要是文件自身的摘要及二次摘要,用不同的keystore進行簽名,生成的MANIFEST.MF與CERT.SF都是一樣的,不同的只有CERT.RSA簽名文件。也就是說前兩者主要保證各個文件的完整性,CERT.RSA從整體上保證APK的來源及完整性,不過META_INF中的文件不在校驗范圍中,這也是V1的一個缺點。V2簽名又是如何保證信息的完整性呢?

前面說過V1簽名中文件的完整性很容易被繞過,可以理解 單個文件完整性校驗的意義並不是很大 ,安裝的時候反而耗時,不如採用更加簡單的便捷的校驗方式。V2簽名就不針對單個文件校驗了,而是 針對APK進行校驗 ,將APK分成1M的塊,對每個塊計算值摘要,之後針對所有摘要進行摘要,再利用摘要進行簽名。

也就是說,V2摘要簽名分兩級,第一級是對APK文件的1、3 、4 部分進行摘要,第二級是對第一級的摘要集合進行摘要,然後利用秘鑰進行簽名。安裝的時候,塊摘要可以並行處理,這樣可以提高校驗速度。

APK是先摘要,再簽名,先看下摘要的定義:Message Digest:摘要是對消息數據執行一個單向Hash,從而生成一個固定長度的Hash值,這個值就是消息摘要,至於常聽到的MD5、SHA1都是摘要演算法的一種。理論上說,摘要一定會有碰撞,但只要保證有限長度內碰撞率很低就可以,這樣就能利用摘要來保證消息的完整性,只要消息被篡改,摘要一定會發生改變。但是,如果消息跟摘要同時被修改,那就無從得知了。

而數字簽名是什麼呢(公鑰數字簽名),利用非對稱加密技術,通過私鑰對摘要進行加密,產生一個字元串,這個字元串+公鑰證書就可以看做消息的數字簽名,如RSA就是常用的非對稱加密演算法。在沒有私鑰的前提下,非對稱加密演算法能確保別人無法偽造簽名,因此數字簽名也是對發送者信息真實性的一個有效證明。不過由於Android的keystore證書是自簽名的,沒有第三方權威機構認證,用戶可以自行生成keystore,Android簽名方案無法保證APK不被二次簽名。

知道了摘要跟簽名的概念後,再來看看Android的簽名文件怎麼來的?如何影響原來APK包?通過sdk中的apksign來對一個APK進行簽名的命令如下:

其主要實現在 android/platform/tools/apksig 文件夾中,主體是ApkSigner.java的sign函數,函數比較長,分幾步分析

先來看這一步,ApkUtils.findZipSections,這個函數主要是解析APK文件,獲得ZIP格式的一些簡單信息,並返回一個ZipSections,

ZipSections包含了ZIP文件格式的一些信息,比如中央目錄信息、中央目錄結尾信息等,對比到zip文件格式如下:

獲取到 ZipSections之後,就可以進一步解析APK這個ZIP包,繼續走後面的簽名流程,

可以看到先進行了一個V2簽名的檢驗,這里是用來簽名,為什麼先檢驗了一次?第一次簽名的時候會直接走這個異常邏輯分支,重復簽名的時候才能獲到取之前的V2簽名,懷疑這里獲取V2簽名的目的應該是為了排除V2簽名,並獲取V2簽名以外的數據塊,因為簽名本身不能被算入到簽名中,之後會解析中央目錄區,構建一個DefaultApkSignerEngine用於簽名

先解析中央目錄區,獲取AndroidManifest文件,獲取minSdkVersion(影響簽名演算法),並構建DefaultApkSignerEngine,默認情況下V1 V2簽名都是打開的。

第五步與第六步的主要工作是:apk的預處理,包括目錄的一些排序之類的工作,應該是為了更高效處理簽名,預處理結束後,就開始簽名流程,首先做的是V1簽名(默認存在,除非主動關閉):

步驟7、8、9都可以看做是V1簽名的處理邏輯,主要在V1SchemeSigner中處理,其中包括創建META-INFO文件夾下的一些簽名文件,更新中央目錄、更新中央目錄結尾等,流程不復雜,不在贅述,簡單流程就是:

這里特殊提一下重復簽名的問題: 對一個已經V1簽名的APK再次V1簽名不會有任何問題 ,原理就是:再次簽名的時候,會排除之前的簽名文件。

可以看到目錄、META-INF文件夾下的文件、sf、rsa等結尾的文件都不會被V1簽名進行處理,所以這里不用擔心多次簽名的問題。接下來就是處理V2簽名。

V2SchemeSigner處理V2簽名,邏輯比較清晰,直接對V1簽名過的APK進行分塊摘要,再集合簽名,V2簽名不會改變之前V1簽名後的任何信息,簽名後,在中央目錄前添加V2簽名塊,並更新中央目錄結尾信息,因為V2簽名後,中央目錄的偏移會再次改變:

簽名校驗的過程可以看做簽名的逆向,只不過覆蓋安裝可能還要校驗公鑰及證書信息一致,否則覆蓋安裝會失敗。簽名校驗的入口在PackageManagerService的install里,安裝官方文檔,7.0以上的手機優先檢測V2簽名,如果V2簽名不存在,再校驗V1簽名,對於7.0以下的手機,不存在V2簽名校驗機制,只會校驗V1,所以,如果你的App的miniSdkVersion<24(N),那麼你的簽名方式必須內含V1簽名:

校驗流程就是簽名的逆向,了解簽名流程即可,本文不求甚解,有興趣自己去分析,只是額外提下覆蓋安裝,覆蓋安裝除了檢驗APK自己的完整性以外,還要校驗證書是否一致只有證書一致(同一個keystore簽名),才有可能覆蓋升級。覆蓋安裝同全新安裝相比較多了幾個校驗

這里只關心證書部分:

Android V1及V2簽名簽名原理簡析

僅供參考,歡迎指正

『伍』 Android的數字簽名

    要確保可靠通信,要解決兩個問題:第一,要確定消息的來源確實是其申明的那個人;其次,要保證信息在傳遞的過程中不被第三方篡改,即使被篡改了,也可以發覺出來。

    數字簽名,就是為了解決這兩個問題而產生的,它是對前面提到的非對稱加密技術與數字摘要技術的一個具體的應用。

對於消息的發送者來說,先要生成一對公私鑰對,將公鑰給消息的接收者。

    如果消息的發送者有一天想給消息接收者發消息,在發送的信息中,除了要包含原始的消息外,還要加上另外一段消息。這段消息通過如下兩步生成:

1)對要發送的原始消息提取消息摘要;

2)對提取的信息摘要用自己的私鑰加密。

    通過這兩步得出的消息,就是所謂的原始信息的數字簽名。

    而對於信息的接收者來說,他所收到的信息,將包含兩個部分,一是原始的消息內容,二是附加的那段數字簽名。他將通過以下三步來驗證消息的真偽:

1)對原始消息部分提取消息摘要,注意這里使用的消息摘要演算法要和發送方使用的一致;

2)對附加上的那段數字簽名,使用預先得到的公鑰解密;

3)比較前兩步所得到的兩段消息是否一致。如果一致,則表明消息確實是期望的發送者發的,且內容沒有被篡改過;相反,如果不一致,則表明傳送的過程中一定出了問題,消息不可信。

    通過這種數字簽名技術,確實可以有效解決可靠通信的問題。如果原始消息在傳送的過程中被篡改了,那麼在消息接收者那裡,對被篡改的消息提取的摘要肯定和原始的不一樣。並且,由於篡改者沒有消息發送方的私鑰,即使他可以重新算出被篡改消息的摘要,也不能偽造出數字簽名。

    綜上所述,數字簽名其實就是只有信息的發送者才能產生的別人無法偽造的一段數字串,這段數字串同時也是對信息的發送者發送信息真實性的一個有效證明。

    很多時候根本就不具備事先溝通公鑰的信息通道。那麼如何保證公鑰的安全可信呢?這就要靠數字證書來解決了。

    所謂數字證書,一般包含以下一些內容:

    證書的發布機構(Issuer)

    證書的有效期(Validity)

    消息發送方的公鑰

    證書所有者(Subject)

·   指紋以及指紋演算法

    數字簽名

    解壓 Android簽名apk之後,會有一個META-INF文件夾,這里有三個文件:

MANIFEST.MF

逐一遍歷裡面的所有條目,如果是目錄就跳過,如果是一個文件,就用SHA1(或者SHA256)消息摘要演算法提取出該文件的摘要然後進行BASE64編碼後,作為「SHA1-Digest」屬性的值寫入到MANIFEST.MF文件中的一個塊中。該塊有一個「Name」屬性,其值就是該文件在apk包中的路徑。

CERT.SF

1》計算這個MANIFEST.MF文件的整體SHA1值,再經過BASE64編碼後,記錄在CERT.SF主屬性塊(在文件頭上)的「SHA1-Digest-Manifest」屬性值值下

2》逐條計算MANIFEST.MF文件中每一個塊的SHA1,並經過BASE64編碼後,記錄在CERT.SF中的同名塊中,屬性的名字是「SHA1-Digest

CERT.RSA

     會把之前生成的 CERT.SF文件, 用私鑰計算出簽名, 然後將簽名以及包含公鑰信息的數字證書一同寫入  CERT.RSA  中保存。CERT.RSA是一個滿足PKCS7格式的文件。

    如果你改變了apk包中的任何文件,那麼在apk安裝校驗時,改變後的文件摘要信息與MANIFEST.MF的檢驗信息不同,於是驗證失敗,程序就不能成功安裝。

    其次,如果你對更改的過的文件相應的算出新的摘要值,然後更改MANIFEST.MF文件裡面對應的屬性值,那麼必定與CERT.SF文件中算出的摘要值不一樣,照樣驗證失敗。

    最後,如果你還不死心,繼續計算MANIFEST.MF的摘要值,相應的更改CERT.SF裡面的值,那麼數字簽名值必定與CERT.RSA文件中記錄的不一樣,還是失敗。

    那麼能不能繼續偽造數字簽名呢?不可能,因為沒有數字證書對應的私鑰。

所以,如果要重新打包後的應用程序能再Android設備上安裝,必須對其進行重簽名。

閱讀全文

與android應用的簽名是什麼相關的資料

熱點內容
linux怎麼配置網路 瀏覽:301
程序員想要的小禮物 瀏覽:184
java獲取網頁url 瀏覽:624
怎麼做解壓神器泡泡版 瀏覽:966
自己動手做一個c編譯器 瀏覽:929
手機如何鏈接谷歌伺服器地址 瀏覽:137
廢掉一個程序員的武功 瀏覽:249
java樹形演算法 瀏覽:641
通達信加鎖指標源碼怎麼看 瀏覽:754
將同名文件移動到部分同名文件夾 瀏覽:403
擺盪指標加壓力線源碼 瀏覽:915
新一代單片機特徵 瀏覽:770
王者的伺服器什麼時候才修好 瀏覽:281
cad歷史命令 瀏覽:41
php博客源代碼 瀏覽:24
cng壓縮機功率 瀏覽:459
pdf批量列印怎麼設置 瀏覽:78
javamap底層 瀏覽:267
賣華為雲伺服器 瀏覽:111
中穎單片機燒錄器 瀏覽:848