无法将AndroidKeyStore序列化为OutputStream

时间:2019-03-15 16:07:50

标签: java android serialization keystore

我正在尝试将Android KeyStore对象保存到文件中,以便以后使用生成的私钥。我需要执行此操作,因为一旦退出应用程序,私钥就会被擦除。为此,我根据thisthisKeyStore对象写入输出流 例。但是,当我尝试这样做时,出现以下错误:

  

java.lang.UnsupportedOperationException:无法将AndroidKeyStore序列化为OutputStream

它发生在mKeyStore.store(keyStoreOutputStream, keyStorePassword);

mKeyStore = KeyStore.getInstance("AndroidKeyStore");
mSignature = Signature.getInstance("SHA256withECDSA");
mKeyStore.load(null);

// Generate private key
PrivateKey key = (PrivateKey) mKeyStore.getKey(KEY_NAME, null);
Certificate [] cert = mKeyStore.getCertificateChain(KEY_NAME);
char[] keyStorePassword = null;

// Store private key into mKeyStore
mKeyStore.setKeyEntry(KEY_NAME, key, null, cert);

// Save mKeyStore to outputstream
String filepath = activity.getFilesDir().getPath().toString() + "/keystore.ks";
try (FileOutputStream keyStoreOutputStream = new FileOutputStream(filepath)) {
    mKeyStore.store(keyStoreOutputStream, keyStorePassword);
}

mSignature.initSign(key);

这是存储KeyStore对象供以后使用的最佳方法吗?如果是这样,我该如何解决Can not serialize AndroidKeyStore to OutputStream错误?

谢谢。

2 个答案:

答案 0 :(得分:1)

Android KeyStoreAndroidKeyStore不同。

AndroidKeyStore是一个Android组件,可用于安全地生成和存储您的密钥。看到 https://developer.android.com/training/articles/keystore

  

Android Keystore系统可让您将加密密钥存储在容器中,以使其更难从设备中提取。密钥存储在密钥库中后,就可以将其用于加密操作,而密钥材料仍不可导出。

键是持久的。重新启动应用程序后,将生成任何生成为AndroidKeyStore的密钥。这是建议的密钥存储方式

请注意,密钥是不可提取的。如果您需要以某种方式导出私钥,则需要使用标准的密钥库文件,而不是AndroidKeystore

答案 1 :(得分:0)

KeyStore.getInstance("AndroidKeyStore");返回一个AndroidKeyStore对象。您可以看到here,在较旧的Android版本中,AndroidKeyStore.store只会引发您正在谈论的异常。

@Override
public void engineStore(OutputStream stream, char[] password) throws IOException,
        NoSuchAlgorithmException, CertificateException {
    throw new UnsupportedOperationException("Can not serialize AndroidKeyStore to OutputStream");
}

我的建议是仅使用KeyStore.getInstance(KeyStore.getDefaultType())