當前位置:首頁 » 操作系統 » apk演算法

apk演算法

發布時間: 2025-02-14 17:51:04

1. APK簽名機制原理詳解

眾所周知,Android系統在安裝Apk的過程中,會對Apk進行簽名校驗,校驗通過後才能安裝成功。那你知道簽名校驗的機制是什麼?具體校驗的是什麼內容嗎?申請第三方SDK(如微信支付)時填入的SAH1值是什絕頌高么?目前眾多的快速批量打包方案又是如何繞過簽名檢驗的?

我將通過一系列的文章來解開這些疑惑:

這篇文章先來介紹Apk簽名相關的基本知識。

要知道簽名是什麼,先來看為什麼需要簽名 。大家都知道,在消息通信時,必須至少解決兩個問題:一是確保消息來源的真實性,二是確保消息不會被第三方篡改。在安裝Apk時,同樣需要確保Apk來源的真實性,以及Apk沒有被第三方篡改。如何解決這兩個問題呢?方法就是開發者對Apk進行簽名:在Apk中寫入一個「指紋」。指紋寫入以後,Apk中有任何修改,都會導致這個指紋無效,Android系統在安裝Apk進行簽名校驗時就會不通過,從而保證了安全性。

要了解如何實現簽名,需要了解兩個基本概念:數字摘要和數字證書。

簡單來說,就是對一個任意長度的數據,通過一個Hash演算法計算後,都可以得到一個固定長度的二進制數據,這個數據就稱為「摘要」。摘要具有下面的幾個特徵:

前面已經說到,可以通過簽名來確保數據來源的可靠性和數據的不可篡改性。簽名就是在摘要的基礎上再進行一次加密,對摘要加密後的數據就可以當作數字簽名,在安裝Apk需要對簽名進行驗證,驗證通過才能繼續安裝。

這里有兩個過程:簽名過程 和 校驗過程。

先來說 簽名過程:

再來看 校驗過程:

這里有一個前提:接收方必須要知道發送方的公鑰和所使用的演算法。如果數字簽名和公鑰一起被篡改,接收方無法得知,還是會校驗通過。如何保證公鑰的可靠性呢?答案是數字證書,數字證書是身份認證機構(Certificate Authority)頒發的,包含了以下信息:

接收方收到消息後,先向CA驗證證書的合法性(根據證書的簽名、綁定的域名等信息。CA機構是權威的,可以保證這個過程的可靠性。)再進行簽名校驗。

需要注意的是,Apk的證書通常的自簽名的,也就是由開發者自己製作,沒有向CA機構申請。Android在安裝Apk時並沒有校驗證書本身的合法性,只是從證書中提取公鑰和加密演算法,這也正是對第三方Apk重新簽名後,還能夠繼續在沒有安裝這個Apk的系統中繼續安裝的原因。

我們在對Apk簽名時並沒有直接指定私鑰、公鑰和數字證書,而是使用keystore文件,這些信息都包含在了keystore文件中。根據編碼不同,keystore文件分為很多種,Android使用的是Java標准keystore格式JKS(Java Key Storage),所以通過Android Studio導出的keystore文件是以.jks結尾的。

keystore使用的證書標準是X.509,X.509標准也有多種編碼格式,常用的有兩種:pem(Privacy Enhanced Mail)和der(Distinguished Encoding Rules)。jks使用的是der格式,Android也支持直接使用pem格式的證書進行簽名,我們下面會介紹。

兩種證書編碼格式的區別:


X.509證書格式:

Android提供了兩種對Apk的簽名方式,一種是基於JAR的簽名方式,另一種是基於Apk的簽名方式,它們的主要區別在於使用的簽名文件不一樣:jarsigner使用keystore文件進行簽名;apksigner除了並尺支持使用keystore文件進行簽名外,還支持直接指定pem證書文件和私鑰進行簽名。

不知道大家有沒有注意一個問題,我們通過櫻御keytool或者AS生成一個keystore的時候( 簽署您的應用 ),除了要輸入keystore的密碼外,還要輸入一個alias和key的密碼。在簽名時,除了要指定keystore文件和密碼外,也要指定alias和key的密碼,這是為什麼呢?

原因是keystore是一個密鑰庫,也就是說它可以存儲多對密鑰和證書,keystore的密碼是用於保護keystore本身的,一對密鑰和證書是通過alias來區分的。從這里可以看出jarsigner是支持使用多個證書對Apk進行簽名的。apksigner也同樣支持,關於apksigner的使用介紹可以參考官方文檔 apksigner 。

ok,簽名的基本概念和校驗過程就介紹到這里,關於JAR簽名和V2簽名機制的詳細介紹,參考下面兩篇文章:

2. Android APK hash值演算法

無符號右移16位然後做異或運算
hash值計算公式:
對於key的hashCode做hash操作,無符號右移16位然後做異或運算。還有平方取中法,偽隨機數法和取余數法。這三種效率都比較低。而無符號右移16位異或運算效率是最高的。集合中的初始化容量(必須是二的n次冪)//默認的初始容量是16--1<<4相當於1*2的4次方---1*16staticfinalintDEFAULT_INITIAL_CAPACITY=1<<4;1212staticfinalinthash(Objectkey){inth;/*
如果key等於null:可以看到當key等於null的時候也是有哈希值的,返回的是0.
如果key不等於null:首先計算出key的hashCode賦值給h,然後與h無符號右移16位後的二進制進行按位異或得到最後的hash值。

3. Android v1、v2、v3簽名詳解

了解 HTTPS 通信的同學都知道,在消息通信時,必須解決確保消息來源的真實性與消息完整性的問題。同理,在安裝 APK 時,也需要驗證 APK 來源的真實性,並確保 APK 未被第三方篡改。為此,Android 官方要求開發者進行簽名,即對 APK 進行加密。簽名涉及基本概念:消息摘要、數字簽名和數字證書。

消息摘要(Message Digest)是將消息數據通過單向哈希函數生成固定長度的哈希值,通常用於驗證數據完整性。SHA-256 是 SHA-1 的升級版,現在 Android 使用的默認演算法為 SHA-256。

數字簽名的作用包括:保證信息傳輸完整性、發送者身份認證與防止抵賴。它通過使用發送者的私鑰加密消息摘要,接收者則用對應公鑰解密並驗證消息完整性。RSA 是常見數字簽名方案,其流程為:使用私鑰加密消息摘要生成簽體,接收者用公鑰解密並驗證。

然而,數字簽名僅確保消息完整性,不保證保密性,且在消息長度較大時效率較低。因此,它通常與快速摘要演算法結合使用,構成有效的簽名方案。

數字證書用於保護公鑰安全可信,它包含公鑰擁有者信息及公鑰,遵循 X.509 標准。數字證書通過 CA 機構的簽名確保其可信度。數字證書結合數字簽名技術,用於確保公鑰的完整性與認證性。

Android 的打包流程包括:資源文件打包、aidl 文件處理、Java 代碼編譯、類文件轉換與 APK 打包等步驟。簽名發生在倒數第二步,針對已存在的 APK 文件,使用開發者自定義的 keystore 簽名。

Android 的應用簽名方案經歷了三代:v1(基於 JAR 簽名)、v2(APK 簽名方案,Android 7.0 引入)、v3(APK 簽名方案升級版,Android 9.0 引入)。v1 到 v2 是顛覆性的升級,主要解決 JAR 簽名方案的安全性問題。v3 為 v2 的升級版,結構上未做重大調整。

v1 到 v2 的升級引入了渠道簽署問題,為不同渠道安裝包提供區別。各大廠提供了開源簽渠道方案,如 Walle(美團)和 VasDolly(騰訊)。簽名工具有 jarsigner 和 apksigner,它們用於 APK 簽名,使用 keystore 文件和 pk8、x509.pem 文件。

簽名過程包括:選取簽名後的 APK,解壓後分析 MANIFEST.MF、CERT.SF、CERT.RSA 文件內容。MANIFEST.MF 文件記錄 APK 內容摘要,CERT.SF 文件記錄摘要的摘要,CERT.RSA 文件則記錄簽名信息。簽名驗證發生在安裝過程中,涉及三個步驟。

APK 簽名方案 v2(Android 7.0 引入)改進了 v1 的簽名校驗速度慢與可修改性問題。它全文件簽名,驗證所有位元組,確保 APK 的完整性與保護性。v3(Android 9.0 引入)在 v2 的基礎上新增新證書塊,記錄所有簽名信息,支持簽名的替換與升級。

總之,Android 簽名機制通過消息摘要、數字簽名與數字證書確保了消息與 APK 的完整性和安全性,同時引入了簽名驗證機制來保護用戶免受篡改與欺騙。簽名方案的升級逐漸改進了性能與安全性,確保了向下兼容性,為開發者提供了強大的安全框架。

4. android加密演算法有哪些

android中用的到加密:

  1. Https編程 :應該是使用帶安全的網路協議處理。除非你本地需要加密

2.數據簽名:混淆代碼和防二次打包的APK加密技術

3.對稱加密:可以先將數據通過某種加密方式加密發送到伺服器端,然後伺服器端再解密 ,項目中除了登陸,支付等介面採用rsa非對稱加密,之外的採用aes對稱加密

4.非對稱加密====支付寶

數字摘要是指通過演算法將長數據變為短數據,通常用來標識數據的唯一性,是否被修改,常用的加密演算法有md5和sha1兩種,如Android的App簽名也是用的這兩種演算法。

由於以上兩種生成數字摘要的演算法都是不可逆的,對於可逆的加密演算法中,按照密鑰的數量和加密規則一半分為對稱加密和非對稱加密兩類:

對稱加密:

密鑰可以自己指定,只有一把密鑰,如果密鑰泄漏數據就會暴漏;

常用的對稱加密演算法有DES和AES兩種;

特點是加密速度快,但是缺點是安全性低,因為只要密鑰暴漏,數據就可以被解密。

非對稱加密的特點:

常見的非對稱加密演算法是RSA;

他有兩把密鑰,且是由程序生成的,不能自己指定;

特點是加密速度比較慢,但是安全性比較高;

加密和解密的規則是:公鑰加密只能私鑰解密,私鑰加密只能公鑰解密;

熱點內容
jdbc創建資料庫 發布:2025-02-15 23:02:15 瀏覽:371
百度雲加密課 發布:2025-02-15 23:00:16 瀏覽:752
php網站畢業論文 發布:2025-02-15 23:00:11 瀏覽:517
linux伺服器日誌查看 發布:2025-02-15 22:48:35 瀏覽:416
模型雕刻機選擇哪個配置的好 發布:2025-02-15 22:44:46 瀏覽:327
我的世界伺服器神奇寶貝 發布:2025-02-15 22:26:21 瀏覽:725
我的世界如何防止伺服器生成怪物 發布:2025-02-15 22:25:35 瀏覽:299
描述瀏覽器緩存機制 發布:2025-02-15 22:25:33 瀏覽:892
手機什麼配置反應快 發布:2025-02-15 22:20:11 瀏覽:672
資料庫存儲表 發布:2025-02-15 22:09:15 瀏覽:961