Android KeyStore - 如何保存RSA PrivateKey

时间:2013-11-21 18:31:07

标签: security keystore android-4.3-jelly-bean

我从一个Web服务(由我自己制作)收到一个基本64字符串编码的RSA PrivateKey PKCS#8。 我的Android应用必须将此密钥安全地保存到手机中。

在Android的4.3版本中,可以使用新的KeyStore API保存密钥。 我找到了article with code axample,它显示了如何使用存储密钥所需的规范生成KeyPair。然后恢复钥匙。

// generate a key pair
Context ctx = getContext();
Calendar notBefore = Calendar.getInstance()
Calendar notAfter = Calendar.getInstance();
notAfter.add(1, Calendar.YEAR);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(ctx)
            .setAlias("key1")
            .setSubject(
                    new X500Principal(String.format("CN=%s, OU=%s", alais,
                            ctx.getPackageName())))
            .setSerialNumber(BigInteger.ONE).setStartDate(notBefore.getTime())
            .setEndDate(notAfter.getTime()).build();

KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
kpGenerator.initialize(spec);
KeyPair kp = kpGenerator.generateKeyPair();

// in another part of the app, access the keys
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry("key1", null);
RSAPublicKey pubKey = (RSAPublicKey)keyEntry.getCertificate().getPublicKey();
RSAPrivateKey privKey = (RSAPrivateKey) keyEntry.getPrivateKey();

但我不明白如何保存现有密钥。有谁能够帮我? 提前致谢

1 个答案:

答案 0 :(得分:9)

KeyStore中,私钥必须与证书一起存储(即使是伪造的自签名证书)。要将密钥存储在AndroidKeyStore中,您应该按照以下步骤操作:

  1. 解码Base64 PKCS#8以获取PrivateKey实例
  2. Web服务发送证书(或证书链)以及私钥,或者PKCS#8 blob也包含公钥。
  3. 如果需要,您需要为私钥生成证书。 BouncyCastle库可以执行此操作(可以找到代码示例here)。
  4. 现在您可以将密钥添加到密钥库中。

    PrivateKey myKey = getKey();
    X509Certificate certificate = getCertificate();
    KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
    keyStore.load(null);
    keystore.setKeyEntry("anAlias", myKey, null, new Certificate[] { certificate });