Android簽名機制
什么是Android簽名
了解 HTTPS 通信的同學都知道,在消息通信時,必須至少解決兩個問題:一是確保消息來源的真實性,二是確保消息不會被第三方篡改。
同理,在安裝 apk 時,同樣也需要確保 apk 來源的真實性,以及 apk 沒有被第三方篡改。為了解決這一問題,Android官方要求開發者對 apk 進行簽名,而簽名就是對apk進行加密的過程。要了解如何實現簽名,需要了解兩個基本概念:消息摘要、數字簽名和數字證書。
消息摘要
消息摘要(Message Digest),又稱數字摘要(Digital Digest)或數字指紋(Finger Print)。簡單來說,消息摘要就是在消息數據上,執行一個單向的 Hash 函數,生成一個固定長度的Hash值,這個Hash值即是消息摘要。
上面提到的的加密 Hash 函數就是消息摘要算法。它有以下特征:
無論輸入的消息有多長,計算出來的消息摘要的長度總是固定的。
例如:應用 MD5 算法摘要的消息有128個比特位,用 SHA-1 算法摘要的消息最終有 160 比特位的輸出,SHA-1 的變體可以產生 192 比特位和 256 比特位的消息摘要。一般認為,摘要的最終輸出越長,該摘要算法就越安全。
消息摘要看起來是「隨機的」。
這些比特看上去是胡亂的雜湊在一起的。可以用大量的輸入來檢驗其輸出是否相同,一般,不同的輸入會有不同的輸出,而且輸出的摘要消息可以通過隨機性檢驗。但是,一個摘要并不是真正隨機的,因為用相同的算法對相同的消息求兩次摘要,其結果必然相同;而若是真正隨機的,則無論如何都是無法重現的。因此消息摘要是「偽隨機的」。
消息摘要函數是單向函數,即只能進行正向的信息摘要,而無法從摘要中恢復出任何的消息,甚至根本就找不到任何與原信息相關的信息。
當然,可以采用強力攻擊的方法,即嘗試每一個可能的信息,計算其摘要,看看是否與已有的摘要相同,如果這樣做,最終肯定會恢復出摘要的消息。但實際上,要得到的信息可能是無窮個消息之一,所以這種強力攻擊幾乎是無效的。
好的摘要算法,沒有人能從中找到「碰撞」。或者說,無法找到兩條消息,使它們的摘要相同。
雖然「碰撞」是肯定存在的(由于長明文生成短摘要的 Hash 必然會產生碰撞)。即對于給定的一個摘要,不可能找到一條信息使其摘要正好是給定的。
正是由于以上特點,消息摘要算法被廣泛應用在「數字簽名」領域,作為對明文的摘要算法。著名的消息摘要算法有 RSA 公司的 MD5 算法和 SHA-1 算法及其大量的變體。SHA-256 是 SHA-1 的升級版,現在 Android 簽名使用的默認算法都已經升級到 SHA-256 了。
正是因為消息摘要具有這種特性,很適合來驗證數據的完整性。比如:在網絡傳輸過程中下載一個大文件 BigFile,我們會同時從網絡下載 BigFile 和 BigFile.md5,BigFile.md5 保存 BigFile 的摘要,我們在本地生成 BigFile 的消息摘要和 BigFile.md5 比較,如果內容相同,則表示下載過程正確。
數字簽名
數字簽名的作用就是保證信息傳輸的完整性、發送者的身份認證、防止交易中的抵賴發生。數字簽名技術是將摘要信息用發送者的私鑰加密,與原文一起傳送給接收者。接收者只有用發送者的公鑰才能解密被加密的摘要信息然后用HASH函數對收到的原文產生一個摘要信息,與解密的摘要信息對比。如果相同,則說明收到的信息是完整的,在傳輸過程中沒有被修改,否則說明信息被修改過,因此數字簽名能夠驗證信息的完整性。
如 RSA 作為數字簽名方案使用時,它的使用流程如下:這種簽名實際上就是用信源的私鑰加密消息,加密后的消息即成了簽體;而用對應的公鑰進行驗證,若公鑰解密后的消息與原來的消息相同,則消息是完整的,否則消息不完整。
新聞熱點
疑難解答
圖片精選