Android Key Store 版本
1. 概述
Android Key Store 是 Android 平台提供的一个安全存储库,用于存储和管理应用程序的加密密钥和证书。它可以帮助开发者保护敏感信息,防止恶意应用程序和攻击者获取和篡改数据。Android Key Store 从 Android 4.3(API 级别 18)开始引入,通过系统级保护提供了一种更安全的密钥存储机制。
在 Android Key Store 中,密钥和证书是以密钥对(公钥和私钥)的形式存储的。开发者可以使用 Android 提供的 API 生成和管理密钥对,并使用它们进行加密、签名和解密操作。
本文将介绍 Android Key Store 的版本历史、用法和示例代码,并通过序列图的形式展示密钥的生成、存储和使用过程。
2. 版本历史
Android Key Store 的版本历史如下:
- Android 4.3(API 级别 18):首次引入 Android Key Store。开发者可以使用 KeyPairGenerator 类生成密钥对,并通过 KeyStore 类将密钥对存储到 Android Key Store 中。
- Android 6.0(API 级别 23):引入了新的系统级保护机制,称为强制加密。只有在设备被解锁后,应用程序才能访问存储在 Android Key Store 中的密钥。
- Android 8.0(API 级别 26):引入了更多的加密算法支持,包括 ECDSA(椭圆曲线数字签名算法)和 ECDH(椭圆曲线 Diffie-Hellman 密钥交换算法)。
- Android 9.0(API 级别 28):引入了 Android Keystore StrongBox,它是一个物理安全模块(TPM)的实现,用于提供更高级别的安全性保护。
3. 用法示例
3.1 生成密钥对
Android Key Store 提供了 KeyPairGenerator 类来生成密钥对。下面是一个示例代码:
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
keyPairGenerator.initialize(new KeyGenParameterSpec.Builder(
"alias", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
.build());
KeyPair keyPair = keyPairGenerator.generateKeyPair();
上述代码中,我们使用 RSA 算法生成了一个密钥对,并将其存储到 Android Key Store 中。其中的 "alias" 是密钥的别名,可以用于后续的密钥检索操作。
3.2 存储密钥对
Android Key Store 提供了 KeyStore 类来管理密钥对的存储。下面是一个示例代码:
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
PrivateKey privateKey = (PrivateKey) keyStore.getKey("alias", null);
PublicKey publicKey = keyStore.getCertificate("alias").getPublicKey();
上述代码中,我们通过 KeyStore 类的 getKey() 和 getCertificate() 方法来检索之前生成的密钥对。
3.3 使用密钥对
生成和存储密钥对后,我们可以使用它们进行加密、签名和解密操作。下面是一个示例代码:
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedData = cipher.doFinal("Hello, Android Key Store!".getBytes());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(encryptedData);
String result = new String(decryptedData);
System.out.println(result); // 输出:Hello, Android Key Store!
上述代码中,我们使用 Cipher 类来进行加密和解密操作。需要注意的是,加密和解密时需要分别使用公钥和私钥进行初始化。
4. 序列图
下面是一个使用序列图表示密钥生成、存储和使用过程的示例:
sequenceDiagram
participant App
participant AndroidKeyStore