Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 簽名機制

Android 簽名機制

編輯:關於Android編程

1、如何對APK簽名

(1)、創建數字證書,android123.keystore

/

 

keytool -genkey -alias android123.keystore -keyalg RSA -validity 20000 -keystore android123.keystore

keytool工具是Java JDK自帶的證書工具

-genkey參數表示:要生成一個證書(版權、身份識別的安全證書)

-alias參數表示:證書有別名,-alias android123.keystore表示證書別名為android123.keystore

-keyalg RSA表示加密類型,RSA表示需要加密,以防止別人盜取

-validity 20000表示有效時間20000天

-keystore android123.keystore表示要生成的證書名稱為android123.keystore

Enter key password for

(RETURN if same as keystore password):此時按回車

生成的數字證書android123.keystore裡面包換了非對稱加密的私鑰、公鑰和證書。

 

(2)、使用數字證書進行簽名

/

jarsigner -verbose -keystore android123.keystore -signedjar test_signed.apk test.apk android123.keystore
jarsigner是Java的簽名工具
-verbose參數表示:顯示出簽名詳細信息
-keystore表示使用當前目錄中的android123.keystore簽名證書文件。
-signedjar test_signed.apk表示簽名後生成的APK名稱,test.apk表示未簽名的APK Android軟件, android.keystore表示別名

 

(3)、簽名後生成了META-INT文件夾,裡面包含的文件如下:

/

通過這三個文件,我們了解下第二步中jarsigner都做了什麼事情,我們先看MANIFEST.MF,如下:

 

Manifest-Version: 1.0
Created-By: 1.0 (Android)

Name: res/raw/aes.lua
SHA1-Digest: M2O7Kjh31bRSTSaX9Kxeg9+r8t0=

Name: AndroidManifest.xml
SHA1-Digest: gJSLROnRQjVNfuSf9ZLQ/jcfjCQ=

Name: lib/armeabi-v7a/libuencrypt.so
SHA1-Digest: 60nq3GlIOFjA2qQwpD0GHF0B+fs=

Name: assets/aes.lua
SHA1-Digest: M2O7Kjh31bRSTSaX9Kxeg9+r8t0=

Name: res/drawable-hdpi-v4/ic_launcher.png
SHA1-Digest: Nq8q3HeTluE5JNCBpVvNy3BXtJI=

Name: res/layout/activity_main.xml
SHA1-Digest: 29xFOv25tmFws/fZywW1pnKb0/0=

Name: res/layout/lv_item.xml
SHA1-Digest: n+ABu8eXc8sgsr/koDg/u1UIHsk=

Name: res/drawable-mdpi-v4/ic_launcher.png
SHA1-Digest: RRxOSvpmhVfCwiprVV/wZlaqQpw=

Name: res/menu/main.xml
SHA1-Digest: FwPQ14VCI33UrtPR12pUamCNBtI=

Name: lib/armeabi-v7a/libalgms.so
SHA1-Digest: l6EtvZsMbYZLCRF/ym+gDCbb66A=

Name: res/layout/gv_item.xml
SHA1-Digest: zJG1Od3RKnHgvtNspfJoL3Gjl9c=

Name: res/drawable-xhdpi-v4/ic_launcher.png
SHA1-Digest: AfPh3OJoypH966MludSW6f1RHg4=

Name: lib/armeabi/libluajava.so
SHA1-Digest: hEXHJ2RO/N4HG7HpkvNLpwkezx8=

Name: resources.arsc
SHA1-Digest: xvke7fWkq3vTndO6GxJygC191Io=

Name: lib/armeabi-v7a/libluajava.so
SHA1-Digest: G1oHj8pHfhE6cTmiIIyLf7q3g5I=

Name: res/layout/notify.xml
SHA1-Digest: cwi7OQR/TBBCikvfrG1mWb/7aQ8=

Name: classes.dex
SHA1-Digest: ZFp/aGRiQlOrGaeCybupky6xL9w=

Name: res/drawable-xxhdpi-v4/ic_launcher.png
SHA1-Digest: GVIfdEOBv4gEny2T1jDhGGsZOBo=

Name: lib/armeabi/libalgms.so
SHA1-Digest: sThUrFV9sUiv9GDot0L92RkYBPs=

Name: lib/armeabi/libuencrypt.so
SHA1-Digest: 60nq3GlIOFjA2qQwpD0GHF0B+fs=

 

裡面包含了所有apk中資源分別求Hash值。

我們再看CERT.SF,如下:

 

Signature-Version: 1.0
SHA1-Digest-Manifest: rpk81cwms7B69LRe8+DWDOXsXh4=
Created-By: 1.0 (Android)

Name: res/raw/aes.lua
SHA1-Digest: 328J86FdzrMHCGbJ9zgSIL66Vhg=

Name: AndroidManifest.xml
SHA1-Digest: 5FgYlUZJI5rg9CliE7aY0lJvQeA=

Name: lib/armeabi-v7a/libuencrypt.so
SHA1-Digest: c4LKMukodajHJes+c40iIKVR5Mc=

Name: assets/aes.lua
SHA1-Digest: bxsaWYSVcIxoulpdWPfY0BV2PiQ=

Name: res/drawable-hdpi-v4/ic_launcher.png
SHA1-Digest: nVLQ/wUjf9D4KSB2I7WqoHR14JY=

Name: res/layout/activity_main.xml
SHA1-Digest: JW6OyAas5Wk9A3gkVFXQfnW5/xM=

Name: res/layout/lv_item.xml
SHA1-Digest: dNWFJFprP0T6rcGEzItXC7wCYkM=

Name: res/drawable-mdpi-v4/ic_launcher.png
SHA1-Digest: NBFXy1maYHW4TAiVCw6R9+EBNqI=

Name: res/menu/main.xml
SHA1-Digest: OKnRLZ88PSIyuOBi7mLTP2st5qo=

Name: lib/armeabi-v7a/libalgms.so
SHA1-Digest: FtY/V2plAUjgAuML1e13WkbAlv4=

Name: res/layout/gv_item.xml
SHA1-Digest: dkF+JesLgH0dGCDQ3n8xB5x27/c=

Name: res/drawable-xhdpi-v4/ic_launcher.png
SHA1-Digest: qLB+xSuTsdod1eS2aPJel/A5PvE=

Name: lib/armeabi/libluajava.so
SHA1-Digest: s4qgp8flPTMEZkF8z5QutBgFxrM=

Name: resources.arsc
SHA1-Digest: 541ycGJWJPTgwVyrgsxvB8pjjCM=

Name: lib/armeabi-v7a/libluajava.so
SHA1-Digest: Ef0wS9E2VVNlCobz+Rfus6H98sQ=

Name: res/layout/notify.xml
SHA1-Digest: ioOWjUP2Gg9EEwhuElzwisdCR6I=

Name: classes.dex
SHA1-Digest: K7z+duqJFBCe/hMgJWJQrzmLwxE=

Name: res/drawable-xxhdpi-v4/ic_launcher.png
SHA1-Digest: W7nSszMeL1x0eIt3K2CoCIHU6Qg=

Name: lib/armeabi/libalgms.so
SHA1-Digest: +F1sBBeuDvU3e9uqpFyvdOSdQAE=

Name: lib/armeabi/libuencrypt.so
SHA1-Digest: JToW2wKlog94dVZeNv3cGOC3CwA=
首先對MANIFEST.MF整個文件求Hash值存放在SHA1-Digest-Manifest中,然後再對MANIFEST.MF裡面的Hash值再求Hash值。

 

最後我們再來看,CERT.RSA,它是個二進制文件。只能通過特定的工具讀出來其中的內容。可參考從CERT.RSA中提取證書一文。

讀出來的內容如下,參考Android簽名與認證詳細分析之二(CERT.RSA剖析),如下圖:

/
 

我們先看最後一步的已加密的Hash值,這是對CERT.SF文件求Hash值然後使用私鑰加密後的結果。

再往上看密鑰,這裡的密鑰指的是非對稱加密的公鑰。這個文件中不保存對稱加密的私鑰。

CERT.RSA還保存了發行者名稱和主體名稱,生效日期和終止日期等待。

了解了這個三個文件的內容,我們也就知道了jarsigner都做了什麼事情。

 

2、簽名的作用

(1)保證內容的完整性

在安裝APK時,計算APK中每個資源的Hash值與MANIFEST.MF裡面的Hash值做對比;如果成功,再計算MANIFEST.MF文件的Hash值與CERT.SF的Hash值做對比;如果成功,使用公鑰解密CERT.RSA已加密的Hash值,然後與對CERT.SF文件求出的Hash值做對比;如果成功,表示驗證通過。

如果惡意修改代碼,再惡意修改MANIFEST.MF對應的Hash值,再惡意修改CERT.SF的Hash值,但是最後無法修改CERT.RSA裡面的Hash值,因為沒有私鑰。

1)如果當前的APK被篡改,直接放入手機中運行,第一步在計算APK中每個資源的Hash值與MANIFEST.MF裡面的Hash值做對比,這一步就Failed了。

2)如果當前的APK被篡改後重新簽名,由於系統中原有同樣包名的apk,發現與原有簽名的公鑰不一致,直接被reject。除非把原應用刪除,再安裝新的應用。

(2)shareUid

如果兩個應用shareUid,說明兩個應用可以對對方的私有目錄進行訪問,這就造成了安全隱患。如果360和QQ,sharedUid,那麼360就可以訪問QQ目錄下(/data/data/com.tencent/...)的私有數據。所以我們規定shardUid的兩個應用必須使用同樣的私鑰進行簽名,在CERT.RSA體現在公鑰一致。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved