我一直在使用密钥库生成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。 而我可以在检索时打印公钥字符串。 任何人都可以帮帮忙。
答案 0 :(得分:2)
看起来你正在从Android Keystore中检索PrivateKey实例。您应该能够将此PrivateKey实例与Cipher和Signature原语一起使用。
什么“不起作用”是PrivateKey实例的getEncoded返回null。正如James K Polk所说,这是按预期工作的。 getEncoded应该返回私钥的密钥材料(通常采用PKCS#8 DER编码格式),如果不支持密钥材料导出,则返回null。 Android Keystore按设计不会显示/导出私钥的密钥材料,因此getEncoded返回null。在较旧的Android平台版本上,它可能会返回一个空的字节数组。