資料來源於Android 官方文檔的:https://developer.android.com/studio/publish/app-signing.html
還有些資料來源於網絡。加以整理!html
在現代密碼體制中加密和解密是採用不一樣的密鑰(公開密鑰),也就是公開密鑰算法(也叫非對稱算法、雙鑰算法)」,每一個通訊方均須要兩個密鑰,即公鑰和私鑰,這兩把密鑰能夠互爲加解密。公鑰是公開的,不須要保密,而私鑰是由我的本身持有,而且必須妥善保管和注意保密。android
數字證書則是由證書認證機構(CA)對證書申請者真實身份驗證以後,用CA的根證書對申請人的一些基本信息以及申請人的公鑰進行簽名(至關於加蓋發證書機 構的公章)後造成的一個數字文件。CA完成簽發證書後,會將證書發佈在CA的證書庫(目錄服務器)中,任何人均可以查詢和下載,所以數字證書和公鑰同樣是公開的。實際上,數字證書就是通過CA認證過的公鑰。算法
原則:安全
一、一個公鑰對應一個私鑰。 二、密鑰對中,讓你們都知道的是公鑰,不告訴你們,只有本身知道的,是私鑰。 三、若是用其中一個密鑰加密數據,則只有對應的那個密鑰才能夠解密。 四、若是用其中一個密鑰能夠進行解密數據,則該數據必然是對應的那個密鑰進行的加密。 五、非對稱密鑰密碼的主要應用就是公鑰加密和公鑰認證,而公鑰加密的過程和公鑰認證的過程是不同的
基於公開密鑰的加密過程服務器
好比有兩個用戶Alice和Bob,Alice想把一段明文經過雙鑰加密的技術發送給Bob,Bob有一對公鑰和私鑰,那麼加密解密的過程以下:markdown
一、Bob將他的公開密鑰傳送給Alice。 二、Alice用Bob的公開密鑰加密她的消息,而後傳送給Bob。 三、Bob用他的私人密鑰解密Alice的消息。
Android要求全部已安裝的應用程序都使用數字證書作數字簽名,數字證書的私鑰由應用開發者持有,
Android使用證書做爲標示應用程序做者的一種方式,並在應用程序之間創建信任的關係。 證書並不用來控制用戶可否安裝哪一個應用。證書不須要由證書認證中心簽名;徹底可使用自制簽名證書。網絡
沒有正確簽名的應用,Android系統不會安裝或運行。此規則適用於在任何地方運行的Android系統,無論是在模擬器仍是真實設備上。由於這個緣由。在真機或模擬器上運行或者調試應用前,必須爲其設置好籤名。app
開發Android的人這麼多,徹底有可能把類名,包名命名成一樣的名字,這個時候該如何區分?因此,這時候就須要簽名來區分了,因爲開發商可能經過使用相同的Package Name來混淆替換已經安裝的程序,簽名能夠保證至關名字,可是簽名不一樣的包不被替換。
發佈過Android應用的朋友們應該都知道,Android APK的發佈是須要簽名的。簽名機制在Android應用和框架中有着十分重要的做用。例如,Android系統禁止更新安裝簽名不一致的APK;若是應用須要使用system權限,必須保證APK簽名與Framework簽名一致。框架
應用程序簽名的一些方面可能會影響應用程序的開發過程, 尤爲是當你計劃發佈多個應用時. 一般狀況下, 對於全部開發者而言,推薦的策略是:在應用程序的整個生命週期,全部的應用程序使用相同的證書籤名.模塊化
爲何這麼作的緣由:
另外一個影響簽名策略的重要考量是, 如何設置簽名應用的key的有效期.
當設計的時候, 須牢記這些要點, 以確保使用合適的證書來簽名應用程序。
運行或從IDE調試項目時,Android的Studio會自動由Android SDK工具生成的調試證書籤名的APK。您運行或調試Android Studio中的項目第一次,IDE會自動在調試密鑰庫和證書 $HOME/.android/debug.keystore,並設置密鑰庫和密鑰的密碼。
由於Debug模式下的證書由構建工具建立,這樣是不安全的,大部分應用程序商店(包括谷歌Play商店)不會接受的APK有出版調試證書籤名。
因此你不用每次調試時都輸入的Android Studio自動存儲在簽約配置調試簽約信息。簽名的配置是由全部必要的信息,以簽署APK,包括密鑰存儲位置,存儲密碼,密鑰名稱,密鑰密碼的對象。您不能直接編輯調試簽約配置,但能夠配置你如何簽上你的發佈版本。
有關如何構建和調試運行的應用程序,看到更多的信息, 生成並運行您的應用程序。
用來簽署APK調試的自簽名證書有365天,從它的建立日期的截止日期。證書過時後,你在構建的時候會報錯的。
爲了解決這個問題,只需刪除該debug.keystore文件。該文件存儲在如下位置:
~/.android/ 在OS X和Linux C:\Documents and Settings\<user>\.android\ 在Windows XP上 C:\Users\<user>\.android\ 在Windows Vista和Windows 7,8,和10
接下來,你構建和運行調試版本的時候,構建工具將從新生成一個新的祕鑰庫和Debug key,請注意!你必須運行你的程序,否則就不會從新生成祕鑰庫和Debug key。
你可使用AndroidStudio 來手動生成簽名的apk,可是這樣每次發佈不一樣的版本的時候就都手動生成一次,比較麻煩的,因此,咱們還能夠配置Gradle文件,在構建的過程當中會自動簽名。
在AndroidStudio中要手動生成簽名的apk,按照如下步驟:
1. 在菜單欄中,Build > Generate Signed APK
2. 選擇您想從下拉釋放下來,而後單擊模塊 下一步。
3. 若是你已經有一個密鑰庫,請轉到步驟5.若是你想建立一個新的密鑰庫,單擊 新建。
4. 在新的密鑰庫窗口,爲您提供密鑰庫和密鑰如下信息,如圖1所示。
圖1。建立Android Studio中一個新的密鑰庫。
Keystore
Key
在生成簽名APK窗口中,選擇一個密鑰庫,私鑰,並輸入密碼兩種。(若是在上一步中建立您的密鑰庫,這些字段已經爲您填充。)而後單擊 下一步。
圖2。選擇Android Studio中的私鑰。
在下一個窗口中,選擇簽署的apk的輸出目錄,和簽名的環境,而後單擊 Finish(完成)。
圖3。生成所選Flavors的APK。
該過程完成後,你會發如今你上面選擇的目標文件夾已經有簽名的APK。您如今能夠經過一個應用市場,如谷歌Play商店,或使用你選擇的機制分發簽署的APK。
在Android Studio中,你能夠經過build.gradle 配置來構建你的項目,在構建的過程當中會自動生成你的apk。步驟以下:
最後點擊ok。
而後AndroidStudio 自動構建編譯,成功後能夠在build/outputs/apk/爲您構建模塊項目目錄內的文件夾中找到咱們輸出的apk。
你應該簽名全部的APK與整個應用程序的壽命預期相同的證書。有幾個緣由,你應該這樣作:
保護你的私鑰的安全性是相當重要的,不管是你仍是用戶,若是容許別人使用你的祕鑰,或者你泄露你的祕鑰文件,使得第三方找到他們並使用它們,那麼你的app安全性將會受到損失~
做爲一個開發者,在任什麼時候候,都要保護好你的私鑰,直到密鑰已過時。如下是一些技巧讓你的密鑰的安全:
當你建立一個簽名的配置的時候,Android的Studio將在純文本模塊的您的簽名信息build.gradle的文件。若是你是一個團隊或用你的代碼工做,你應該讓它變成一個不容易給別人訪問的移動的文件。要作到這一點,你應該建立一個單獨的屬性文件來存儲安全的信息,
建立一個文件名 爲keystore.properties在項目的根目錄。這個文件應該包含您的簽名信息,以下所示:
storePassword = myStorePassword keyPassword = mykeyPassword keyAlias = myKeyAlias storeFile = myStoreFileLocation
在你的模塊的build.gradle文件中,添加的代碼加載你keystore.properties的文件以前android 塊。
... // Create a variable called keystorePropertiesFile, and initialize it to your // keystore.properties file, in the rootProject folder. def keystorePropertiesFile = rootProject.file("keystore.properties") // Initialize a new Properties() object called keystoreProperties. def keystoreProperties = new Properties() // Load your keystore.properties file into the keystoreProperties object. keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) android { ... }
你可使用語法,來引用存儲的簽名信息:
android { signingConfigs { config { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile']) storePassword keystoreProperties['storePassword'] } } ... }
若是你不用AndroidStudio來簽名你的apk,你還可使用Android SDK 和 JDK 自帶的工具,步驟以下:
$ keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
提示您輸入密鑰庫和密鑰的密碼,併爲你的key設置別名。而後生成密鑰庫做爲一個名爲my-release-key.keystore。密鑰庫包含單個鍵,有效10000天。別名是簽署您的應用程序時,您將在之後使用的名稱。
2. 編譯發佈模式下您的應用程序,以得到一個無符號的APK。
3. 使用jarsigner來簽名你的app:
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
上面提示您輸入密鑰庫和密鑰的密碼。而後簽名apk。
4. 驗證你的apk簽名:
$ jarsigner -verify -verbose -certs my_application.apk
…
5. 使用zipalign來對齊apk包:
$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
zipalign 確保全部的未壓縮數據與特定字節對齊相對於文件,從而下降apk文件的大小。
學習理解並整理下來的筆記。
但願你們可以指點或提出寶貴意見,謝謝!一塊兒學習。
轉載請註明出處:http://blog.csdn.net/u011974987/article/details/52415037
我的站點:xuhao.tech