APK V2 0簽名架構

2021-08-21 07:13:34 字數 2676 閱讀 1968

references:

android中支援兩種簽名方式:

* 基於jar簽名的方案(v1)

* android7.0引入的apk簽名方案(v2)

v1版本中存在兩個問題:

*v1簽名並不保護apk中的所有資料,如zip元資料就不被保護。apk驗證程式要驗證大量的不可信的資料結構,然後捨棄未受簽名保護的資料。這就存在了很大的攻擊面。

*apk驗證程式必須解壓所有已壓縮的條目,而這需要花費更多的時間和記憶體,這些v2版本已基本改進或解決。

# 概述

v2簽名是一種全檔案簽名方案,該方案能夠發現對apk的受保護部分進行的所有更改,從而有助於加快驗證速度並增強完整性保護。

使用 apk 簽名方案 v2 進行簽名時,會在 apk 檔案中插入乙個 apk 簽名分塊,該分塊位於「zip **目錄」部分之前並緊鄰該部分。在「apk 簽名分塊」內,v2 簽名和簽名者身份資訊會儲存在 apk 簽名方案 v2 分塊中。

apk 簽名方案 v2 是在 android 7.0 (nougat) 中引入的。為了使 apk 可在 android 6.0 (marshmallow) 及更低版本的裝置上安裝,應先使用 jar 簽名功能對 apk 進行簽名,然後再使用 v2 方案對其進行簽名。

# apk簽名分塊

「apk簽名分塊」是為了支援v2簽名而引入的新容器。該分塊包含多個「id-值」對,所採用的封裝方式有助於更輕鬆地在 apk 中找到該分塊。

apk 由乙個或多個簽名者/身份簽名,每個簽名者/身份均由乙個簽名金鑰來表示。該資訊會以「apk 簽名方案 v2 分塊」的形式儲存。對於每個簽名者,都會儲存以下資訊:

* (簽名演算法、摘要、簽名)元組。摘要會儲存起來,以便將簽名驗證和 apk 內容完整性檢查拆開進行。

* 表示簽名者身份的 x.509 證書鏈。

* 採用鍵值對形式的其他屬性。

對於每位簽名者,都會使用收到的列表中支援的簽名來驗證 apk。簽名演算法未知的簽名會被忽略。如果遇到多個支援的簽名,則由每個實現來選擇使用哪個簽名。這樣一來,以後便能夠以向後相容的方式引入安全係數更高的簽名方法。建議的方法是驗證安全係數最高的簽名。

signature-version: 1.0

created-by: 1.0 (android)

sha-256-digest-manifest: jmvib0ovmdgbymmfwbimxjpuinstto705nqvkdfhw/0=

x-android-apk-signed: 2

name: androidmanifest.xml

sha-256-digest: 4cf4bvsx/retgu/l040t7qfj4v9awh6baboo4fpldtm=

name: classes.dex

sha-256-digest: k6hzcku/xexcm3sqpqjaildpaw5cgvcqwewrwqa0lqs=

如上為「apk 簽名方案 v2 分塊」的格式,針對每個檔案均生成乙個簽名。android平台支援的簽名演算法包括:

# 受完整性保護的內容

為了保護 apk 內容,apk 包含以下 4 個部分:

apk 簽名方案 v2 負責保護第 1、3、4 部分的完整性,以及第 2 部分包含的「apk 簽名方案 v2 分塊」中的 signed data 分塊的完整性。

# 防回滾保護

攻擊方式1:

攻擊者可能會試圖在支援對帶 v2 簽名的 apk 進行驗證的 android 平台上將帶 v2 簽名的 apk

作為帶 v1 簽名的 apk 進行驗證。

防護措施1:為了防範此類攻擊,帶 v2 簽名的 apk 如果還帶 v1 簽名,其 meta-inf/.sf 檔案的主要部分中必須包含 x-android-apk-signed 屬性。該屬性的值是一組以英文逗號分隔的 apk 簽名方案 id(v2 方案的 id 為 2)。在驗證 v1 簽名時,對於此組中驗證程式首選的 apk 簽名方案(例如,v2 方案),如果 apk 沒有相應的簽名,apk 驗證程式必須要拒絕這些 apk。此項保護依賴於內容 meta-inf/.sf 檔案受 v1 簽名保護這一事實。

攻擊方式2:攻擊者可能會試圖從「apk 簽名方案 v2 分塊」中刪除安全係數較高的簽名。

防護措施2:為了防範此類攻擊,對 apk 進行簽名時使用的簽名演算法 id 的列表會儲存在通過各個簽名保護的 signed data 分塊中。

# 驗證

如圖為android7.0+版本的apk簽名驗證過程。

# v2驗證

2)找到「apk 簽名分塊」中的第乙個「apk 簽名方案 v2 分塊」。如果 v2 分塊存在,則繼續執行第 3 步。否則,回退至使用 v1 方案驗證 apk。

3)對「apk 簽名方案 v2 分塊」中的每個 signer 執行以下操作:

4)如果找到了至少乙個 signer,並且對於每個找到的 signer,第 3 步都取得了成功,apk 驗證將會成功。

# v1驗證

完整性按照以下方式進行驗證:

因此,保護鏈是每個受完整性保護的 jar 條目的 .(rsa|dsa|ec) -> .sf -> manifest.mf -> 內容。

位元幣2 0 以太坊架構

以太坊由底層服務,核心層,頂層應用組成。1.底層服務 包括p2p網路 保證節點彼此平等 leveldb資料庫 區塊,交易等資料儲存 密碼學演算法 保證資料私隱性和區塊安全性 以及分片優化 並行驗證交易,加大區塊生成 等基礎服務 2.核心層 區塊鏈 主體 共識演算法 保證一致性和正確性 和以太坊虛擬機...

UCHOME2 0檔案架構

uchome檔案架構非常簡潔清晰,哪個功能對應哪個功能,都一目了然。在跟目錄這裡,首先先看看common.php,config.php,common.php include config.php,common.php是所有全域性變數和通用類 例如資料庫類 的接入口,config.php是ucente...

MapReduce2 0 原理 架構 應用場景

良好的擴充套件性,即可以很容易的增加節點 適合pb級別的資料的離線處理 map階段 輸入資料的解析 inputformat 輸入分組 partitioner 本節點的規約 combiner reduce階段 shuffling階段拉取資料 桶排序,是乙個hash過程,使得相同的key可以排在一堆 資...