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

时间:2016-03-04 11:37:23

标签: android encryption rsa android-6.0-marshmallow android-keystore

我一直在使用密钥库生成RSA密钥/对,代码一直在用于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。 而我可以在检索时打印公钥字符串。 任何人都可以帮帮忙。

1 个答案:

答案 0 :(得分:2)

看起来你正在从Android Keystore中检索PrivateKey实例。您应该能够将此PrivateKey实例与Cipher和Signature原语一起使用。

什么“不起作用”是PrivateKey实例的getEncoded返回null。正如James K Polk所说,这是按预期工作的。 getEncoded应该返回私钥的密钥材料(通常采用PKCS#8 DER编码格式),如果不支持密钥材料导出,则返回null。 Android Keystore按设计不会显示/导出私钥的密钥材料,因此getEncoded返回null。在较旧的Android平台版本上,它可能会返回一个空的字节数组。