Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android中簽名、證書、公鑰密鑰的概念及使用

android中簽名、證書、公鑰密鑰的概念及使用

編輯:關於Android編程

公鑰和私鑰的概念

在現代密碼體制中加密和解密是采用不同的密鑰(公開密鑰),也就是公開密鑰算法(也叫非對稱算法、雙鑰算法)”,每個通信方均需要兩個密鑰,即公鑰和私鑰,這兩把密鑰可以互為加解密。公鑰是公開的,不需要保密,而私鑰是由個人自己持有,並且必須妥善保管和注意保密。

證書的概念

數字證書則是由證書認證機構(CA)對證書申請者真實身份驗證之後,用CA的根證書對申請人的一些基本信息以及申請人的公鑰進行簽名(相當於加蓋發證書機 構的公章)後形成的一個數字文件。CA完成簽發證書後,會將證書發布在CA的證書庫(目錄服務器)中,任何人都可以查詢和下載,因此數字證書和公鑰一樣是公開的。實際上,數字證書就是經過CA認證過的公鑰。

原則:

1、一個公鑰對應一個私鑰。

2、密鑰對中,讓大家都知道的是公鑰,不告訴大家,只有自己知道的,是私鑰。

3、如果用其中一個密鑰加密數據,則只有對應的那個密鑰才可以解密。

4、如果用其中一個密鑰可以進行解密數據,則該數據必然是對應的那個密鑰進行的加密。

5、非對稱密鑰密碼的主要應用就是公鑰加密和公鑰認證,而公鑰加密的過程和公鑰認證的過程是不一樣的

基於公開密鑰的加密過程

比如有兩個用戶Alice和Bob,Alice想把一段明文通過雙鑰加密的技術發送給Bob,Bob有一對公鑰和私鑰,那麼加密解密的過程如下:

1、Bob將他的公開密鑰傳送給Alice。

2、Alice用Bob的公開密鑰加密她的消息,然後傳送給Bob。

3、Bob用他的私人密鑰解密Alice的消息。

Android中的簽名:

是什麼簽名?


Android要求所有已安裝的應用程序都使用數字證書做數字簽名,數字證書的私鑰由應用開發者持有,
Android使用證書作為標示應用程序作者的一種方式,並在應用程序之間建立信任的關系。 證書並不用來控制用戶能否安裝哪個應用。證書不需要由證書認證中心簽名;完全可以使用自制簽名證書。

沒有正確簽名的應用,Android系統不會安裝或運行。此規則適用於在任何地方運行的Android系統,不管是在模擬器還是真實設備上。因為這個原因。在真機或模擬器上運行或者調試應用前,必須為其設置好簽名。

為什麼要有簽名?


開發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\\.android\ 在Windows XP上
C:\Users\\.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 stZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcmUgcGF0aDqjutGh1PHE+rXEw9zUv7TmtKLTprjDtLS9qLXEzrvWw6GjIFBhc3N3b3Jko7q0tL2osqLIt8jPxPq1xMPc1L+/4rCyyKu1xMPcwuuhoyA8L2NvZGU+PC9jb2RlPg0KPHA+PGNvZGU+PGNvZGU+PHN0cm9uZz5LZXk8L3N0cm9uZz48L2NvZGU+PC9jb2RlPjwvcD4NCjxjb2RlPjxjb2RlPkFsaWFzo7rE47XERW50ZXK8/LXEserKtsP7s8ahoyBQYXNzd29yZDogtLS9qLKiyLfIz8TjtcTD3NS/tcSwssirw9zC66Gj1eLTprjDyse008Tj0aHU8cTjtcTD3NS/v+K1xMPcwuuyu82sIFZhbGlkaXR5ICh5ZWFycymjusno1sO1xMqxvOSzpLbI1Nq8uMTqo6zE47XEa2V5vavKx9PQ0Ke1xKGjxOO1xGtledOmuMPKx9PQ0KfG2tbBydnOqjI1xOrAtKOs1eLR+cTjvs2/ydLUzai5/cTjtcTTptPDs8zQ8rXEytnD/M/gzay1xMPc1L/HqcP7tcTTptPDs8zQ8rj80MKhoyBDZXJ0aWZpY2F0ZaO6yuTI69PQudjX1Ly6tcTSu9Cp0MXPoqOszqrE+rXE1qTK6aGj1eK49tDFz6LKx7K7ysfU2sTjtcTTptPDs8zQ8tbQz9TKvqOstavKx8r009phcGu1xNK7sr+31qGjPGJyIC8+DQrM7s3qyc/D5tDFz6KjrMi7uvO1pbv3yLe2qKGjIDwvY29kZT48L2NvZGU+DQo8cD48Y29kZT48Y29kZT7U2sn6s8nHqcP7QVBLtLC/2tbQo6zRodTx0ru49sPc1L+/4qOsy73Uv6OssqLK5Mjrw9zC68G91taho6OoyOe5+9Tayc/Su7K91tC0tL2oxPq1xMPc1L+/4qOs1eLQqdfWts7S0b6tzqrE+szus+Sho6OpyLu687Wlu/cgz8LSu7K9oaM8L2NvZGU+PC9jb2RlPjwvcD4NCjxwPjxjb2RlPjxjb2RlPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160903/20160903091935397.png" title="\" />
圖2。選擇Android Studio中的私鑰。

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

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

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

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


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

在當前你的項目,右鍵點擊你的程序,然後打開Projec Structure, 再打開的窗口中,在模塊的左側面板中選擇你想簽署的Module。 選擇你的密碼存儲文件,然後輸入相關的信息;如圖:
這裡寫圖片描述
圖4。用於創建新簽名構造的窗口。 點擊Ok。 然後在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 自帶的工具,步驟如下:

使用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文件的大小。

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