KeyStore密鑰庫簡介
爲有效保護加密密鑰, Android特設了一套密鑰管理機制,即KeyStore密鑰庫。 KeyStore爲應用提供了生成與獲取密鑰或者證書的服務,是一個原生的後臺守護進程。所有的公鑰、私鑰、證書都會被存儲在密鑰庫中。
密鑰庫中有很多密鑰項,每條密鑰項都會對應一個別名,密鑰項中存的可能是一個非對稱密鑰對,也可能是一個祕密密鑰,如果保存的是密鑰對,那還可能保存一個證書鏈,證書鏈第一個證書包含公鑰。
證書項:只包含一個公鑰證書,是證書而不是證書鏈
密鑰庫類型
1:BKS 安卓中默認的密鑰庫類型
擴展名爲.bks,基於JCE實現,密鑰庫的BC實現版本(Bouncycastle)
2:JKS
JKS類型密鑰庫的擴展名爲 :.jks / .ks
密鑰庫的java實現版本,密鑰庫和私鑰用不同的密碼進行保護,不支持單獨密鑰
3:JCEKS
密鑰庫的JCE實現版本,擴展名爲.jce,相對於.jks安全級別再高,採用TripleDES保護私鑰 ,支持單獨密鑰
4:PKCS12
擴展名爲.p12/.pfx,包含私鑰、公鑰及其證書,密鑰庫和私鑰用相同密碼進行保護,不支持單獨祕鑰
5:UBER
擴展名爲.ubr,密鑰庫BC更安全實現版本(Bouncycastle UBER)
密鑰庫文件保存位置/data/misc/keystore/user_0 :
手機用戶所擁有的各項證書,名稱包含應用的UID(前綴)、證書類型、證書別名(唯一性)例如:10064_CACERT_test,通過以下方法可以獲取所有證書別名
4.3以下版本中,getInstance("AndroidKeyStore");實例化密鑰庫會發生異常:
java.security.NoSuchAlgorithmException: KeyStore AndroidKeyStore implementation not found
4.3以上版本中可以正常使用getInstance("AndroidKeyStore")實例化密鑰庫
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
Enumeration<String> aliases = ks.aliases();
while (aliases.hasMoreElements()) {
CommonUtils.LogUtils.e("證書:" + aliases.nextElement());
}
證書類型
1:DER
擴展名爲.cer/.crt/.rsa ,不含私鑰ASN.1 DER
2:PKCS7
.p7b :以樹狀展示證書鏈,不含私鑰
.p7r:爲CA對證書請求籤名的回覆,只能用於導入
3:CMS
.p7c:只保存證書
.p7m:帶信封數據的簽名
.p7s:時間戳簽名文件
4:PEM
.pem
5:PKCS10
.p10 / .csr
6:SPC
微軟公司特有的雙證書文件格式,經常用於代碼簽名
.pvk :用於保存私鑰
.spc :用於保存公鑰