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