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 是一个空字节数组。
我一直在使用密钥库生成 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 是一个空字节数组。