編輯:關於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體現在公鑰一致。
安卓系統手機的通知欄可以顯示QQ圖標,但沒有退出QQ的狀態下,手機qq不顯示圖標怎麼回事?手機qq不顯示圖標怎麼辦?下面我們就一起來看看吧!手機qq不顯示圖
一、批量打包1、集成了友盟統計,並在AndroidManifest.xml中添加了如下代碼<meta-dataandroid:name=UMENG_CHANNELa
項目中經常使用style和Theme,但卻從來沒有考慮過它們的區別,只會copy來copy去的,有時候還有些迷茫,為了徹底告別迷茫,現把這兩者的區別和使用總結出來,供自己
這裡主要講解垃圾收集理論上的算法,下一篇會介紹一些實現了這些算法的垃圾收集器。一般我們談垃圾收集從三個問題來幫你理解jvm的垃圾收集策略:1.怎麼判斷哪些內存是垃圾?2.