API-23 (Marshmallow) 中未生成私钥

Private key is not getting generated in API-23 (Marshmallow)

我一直在使用密钥库生成 RSA key/pair,代码一直在 API 级别 18-22 工作。 今天当我 运行 它在 API-23 时,我无法从密钥库中检索私钥。 下面是我一直在使用的代码:

KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
                        .setAlias(utility.getConfigValue(configuration, OuterKeys.KEYSTORE_NAME))
                        .setSubject(
                                new X500Principal("CN=Sample Name, O=Android Authority"))
                        .setSerialNumber(BigInteger.ONE).setStartDate(start.getTime())
                        .setEndDate(end.getTime()).build();
                KeyPairGenerator generator = null;
                generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
                generator.initialize(spec);
                KeyPair keyPair = generator.generateKeyPair();
                PrivateKey privateKey = keyPair.getPrivate();
                PublicKey publicKey = keyPair.getPublic();

                byte[] publicKeyBytes = publicKey.getEncoded();
                String pubKeyStr = Base64.encodeToString(publicKeyBytes, Base64.NO_PADDING);
                byte[] privKeyBytes = privateKey.getEncoded();
                String privKeyStr = Base64.encodeToString(privKeyBytes, Base64.NO_PADDING);

                Log.d("^^^^^^^^^1",pubKeyStr);
                Log.d("^^^^^^^^^2",privKeyStr);

调试了一下,发现生成的私钥为null。 而我可以在检索 public 键字符串时打印它。 有谁能帮帮忙吗

看起来您正在从 Android Keystore 中检索 PrivateKey 实例就好了。您应该也可以将此 PrivateKey 实例与 Cipher 和 Signature 原语一起使用。

"not working" 是 PrivateKey 实例的 getEncoded return 为空。正如 James K Polk 所提到的,这是按预期工作的。 getEncoded 应该 return 私钥的密钥 material(通常采用 PKCS#8 DER 编码格式),如果不支持密钥 material 导出,则为 null。 Android Keystore 按设计不 reveal/export 密钥 material 私钥,因此 getEncoded return 为空。在较旧的 Android 平台版本上,它可能 return 是一个空字节数组。