Android中籤名、證書、公鑰密鑰的概念及使用

資料來源於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系統不會安裝或運行。此規則適用於在任何地方運行的Android系統,無論是在模擬器仍是真實設備上。由於這個緣由。在真機或模擬器上運行或者調試應用前,必須爲其設置好籤名。app

爲何要有簽名?


開發Android的人這麼多,徹底有可能把類名,包名命名成一樣的名字,這個時候該如何區分?因此,這時候就須要簽名來區分了,因爲開發商可能經過使用相同的Package Name來混淆替換已經安裝的程序,簽名能夠保證至關名字,可是簽名不一樣的包不被替換。
發佈過Android應用的朋友們應該都知道,Android APK的發佈是須要簽名的。簽名機制在Android應用和框架中有着十分重要的做用。例如,Android系統禁止更新安裝簽名不一致的APK;若是應用須要使用system權限,必須保證APK簽名與Framework簽名一致。框架

簽名策略


應用程序簽名的一些方面可能會影響應用程序的開發過程, 尤爲是當你計劃發佈多個應用時. 一般狀況下, 對於全部開發者而言,推薦的策略是:在應用程序的整個生命週期,全部的應用程序使用相同的證書籤名.模塊化

爲何這麼作的緣由:

  • 應用程序升級 – 當發佈應用的更新時, 若是想讓用戶無縫地升級到新版本, 須要繼續使用相同的某個或者某一套證書來簽名更新包.當系統安裝應用的更新時, 它會比較現有版本和新版本的證書. 若是證書吻合, 包括證書數據和順序都吻合, 那麼系統容許更新.若是新版本所作的簽名不是匹配的, 那麼將須要給應用起一個不一樣的包名 — 在這種狀況下, 用戶至關於安裝了一個徹底的新程序.
  • 應用程序模塊化 – Android容許由相同證書籤名的應用程序運行在相同的進程中, 此時系統會將它們做爲單個應用程序對待.在這種方式中, 能夠按模塊化的方式部署應用, 用戶能夠根據須要獨立地更新每個模塊.
  • 代碼/數據 的受權共享 – Android 提供模式匹配的權限控制機制,所以一個應用能夠暴露功能給另外一個用指定證書籤名的應用. 經過用相同證書籤名多個應用,以及使用模式匹配的權限檢查,應用程序能夠以安全的方式共享代碼和數據.

另外一個影響簽名策略的重要考量是, 如何設置簽名應用的key的有效期.

  • 若是計劃爲某個單獨的應用程序提供更新支持, 那麼應該確認key的有效期要比應用的壽命長. 推薦25年或者更長的有效期.當key的有效期過時, 用戶將不再能無縫地更新到應用程序的新版本.
  • 若是要使用相同的key爲多個不一樣的應用簽名, 應當確認key的有效期比全部這些應用的全部版本的生命週期還長,包括要比未來加到這個套件中的額外的關聯應用的生命週期更長.
  • 若是計劃將應用程序發佈到Android Market, 爲應用簽名的key的有效期必須在2033年10月22日之後.Market服務器強制執行這個規則, 來保證當新版本可用時, 用戶能夠無縫地更新Market應用.

當設計的時候, 須牢記這些要點, 以確保使用合適的證書來簽名應用程序。

Debug模式下的簽名


運行或從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 store path::選擇您的密鑰存儲應該建立的位置。
  • Password:建立並確認您的密鑰庫安全的密碼。

Key

  • Alias:你的Enter鍵的標識名稱。
  • Password: 建立並確認你的密鑰的安全密碼。這應該是從你選擇你的密鑰庫的密碼不一樣
  • Validity (years):設置的時間長度在幾年,你的key將是有效的。你的key應該是有效期至少爲25年來,這樣你就能夠經過你的應用程序的壽命相同的密鑰簽名的應用程序更新。
  • Certificate:輸入有關本身的一些信息,爲您的證書。這個信息是否是在你的應用程序中顯示,可是屬於apk的一部分。
    填完上面信息,而後單擊肯定。

在生成簽名APK窗口中,選擇一個密鑰庫,私鑰,並輸入密碼兩種。(若是在上一步中建立您的密鑰庫,這些字段已經爲您填充。)而後單擊 下一步。

這裏寫圖片描述
圖2。選擇Android Studio中的私鑰。

在下一個窗口中,選擇簽署的apk的輸出目錄,和簽名的環境,而後單擊 Finish(完成)。

這裏寫圖片描述
圖3。生成所選Flavors的APK。

該過程完成後,你會發如今你上面選擇的目標文件夾已經有簽名的APK。您如今能夠經過一個應用市場,如谷歌Play商店,或使用你選擇的機制分發簽署的APK。

配置build.gradle文件自動簽名你的apk


在Android Studio中,你能夠經過build.gradle 配置來構建你的項目,在構建的過程當中會自動生成你的apk。步驟以下:

  1. 在當前你的項目,右鍵點擊你的程序,而後打開Projec Structure,
  2. 再打開的窗口中,在模塊的左側面板中選擇你想簽署的Module。
  3. 選擇你的密碼存儲文件,而後輸入相關的信息;如圖:
    這裏寫圖片描述
    圖4。用於建立新簽名構造的窗口。
  4. 點擊Ok。
  5. 而後在build types配置中 選擇剛剛簽名的配置。如圖:
    這裏寫圖片描述

最後點擊ok。

而後AndroidStudio 自動構建編譯,成功後能夠在build/outputs/apk/爲您構建模塊項目目錄內的文件夾中找到咱們輸出的apk。

簽名注意事項


你應該簽名全部的APK與整個應用程序的壽命預期相同的證書。有幾個緣由,你應該這樣作:

  • 應用程序升級:當系統安裝更新到一個應用程序,它在新版本中與那些在現有版本的證書(S)比較。該系統容許更新,若是證書相匹配。若是你用不一樣的證書籤名的新版本,你必須在不一樣的包名稱分配給應用程序,在這種狀況下,用戶安裝新版本做爲一個全新的應用程序。
  • 應用模塊:若是是app,Android 容許同一證書籤名在同一個進程中運行的APK,所以,系統會將其視爲一個單一的應用程序。經過這種方式,你能夠部署模塊你的應用程序。
  • 代碼/數據,經過共享的權限:Android提供了基於簽名的權限執行,這樣應用程序能夠公開的功能到與指定的證書籤名的另外一個應用程序。經過簽署多個APK使用相同的證書,並使用基於簽名的權限檢查,您的應用程序能夠在一個安全的方式共享代碼和數據。

保護您的私鑰


保護你的私鑰的安全性是相當重要的,不管是你仍是用戶,若是容許別人使用你的祕鑰,或者你泄露你的祕鑰文件,使得第三方找到他們並使用它們,那麼你的app安全性將會受到損失~

做爲一個開發者,在任什麼時候候,都要保護好你的私鑰,直到密鑰已過時。如下是一些技巧讓你的密鑰的安全:

  • 選擇不容易破解的密碼,和keystore;
  • 不要給外人你的私鑰和keystore文件;
  • 把他們放置在一個安全的地方。

刪除簽名信息


當你建立一個簽名的配置的時候,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 自帶的工具,步驟以下:

  1. 使用keytool 生成私鑰,例如:
$ 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

相關文章
相關標籤/搜索