1、AndroidKeystore密钥库系统介绍
AndroidKeystore
系统是一个密钥库管理系统,谷歌设计这个系统的初衷应该是为了对标苹果的钥匙串KeyChain
,有意思的是谷歌在Android4.0(API14)时便引入了KeyChain
,但是并未提供详尽的说明文档,仅仅提供了一个API文档,网上也没有什么对它的文章,着实让人费解。话不多说,有兴趣的同学可以自行搜索,下面我来给大家介绍一下今天的主角——AndroidKeystore
。
谷歌在Android4.3(API18)中引入了AndroidKeystore
,在Android6.0(API23)中对AndroidKeystore
进行了一波升级优化,目前来说应该是最安全的加解密方案。根据官方文档说明,原文对它的介绍如下:
利用 Android Keystore 系统,您可以在容器中存储加密密钥,从而提高从设备中提取密钥的难度。在密钥进入 Keystore 后,可以将它们用于加密操作,而密钥材料仍不可导出。此外,它提供了密钥使用的时间和方式限制措施,例如要求进行用户身份验证才能使用密钥,或者限制为只能在某些加密模式中使用。
乍一看,这似乎是一个密钥保险箱,安全性高,可以把加密密钥存入其中,需要的时候再通过它用我们的密钥。**可是!!这货的使用根本就不是个存储空间!!**我们先来看看这东西大致的使用流程是怎样的,让大家直观的明白它的作用:
// step 1 通过密钥别名判断是否已有密钥
keyStore.containsAlias(keyAlias);
// step 2 没有密钥,生成一个
spec = new KeyGenParameterSpec.Builder(keyAlias, ...)...;
keyPairGenerator.initialize(spec);
keyPairGenerator.generateKeyPair();
// step 3 取出公钥,进行加密
publicKey = ((KeyStore.PrivateKeyEntry)entry).getCertificate().getPublicKey();
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
cipher.doFinal(data);
// step 4 取出私钥,进行解密
privateKey = ((KeyStore.PrivateKeyEntry)entry).getPrivateKey();
cipher.init(Cipher.DECRYPT_MODE, privateKey);
cipher.doFinal(data);
如此看来,AndroidKeystore
根本就不是个密钥存储库。这和EncryptUtil这样的工具类几乎是一样的,先init,再encrypt,然后decrypt,俨然一个加解密工具。说白了,它在内部生成一个密钥,我们可以用它来加解密数据,并不能把我们自己生成的密钥送进去。
根据文档的介绍,它的大部分功能都只在Android6.0(API23)及以上支持,最低支持的Android4.3(API18)只提供RSA/ECB算法的使用。
2、密钥的检测与生成
AndroidKeystore是通过密钥的别名来进行加解密的,那么我们在使用之前必然是需要判断一下密钥是否存在的,AndroidKeystore提供了containsAlias()方法来完成密钥的检测,具体使用如下:
public boolean hasKey(String keyAlias) {
try {
// 加载一个AndroidKeyStore类型的KeyStore,貌似是定死的类型。
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
return keyStore.containsAlias(keyAlias);
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e