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 :用于保存公钥